home *** CD-ROM | disk | FTP | other *** search
/ C & C++ Multimedia Cyber Classroom / C and C++ Multimedia Cyber Classroom (Prentice Hall) (1998).iso / cpphtp2 / cpphtp2.jar / chpt_21.gml < prev    next >
Text File  |  1998-03-03  |  87KB  |  2,179 lines

  1. <html>
  2. <chapter>
  3. <section type=Popup name=Quotes title="Quotes">
  4. <page>
  5. <i>"...to thine own self be 
  6. true,..."</i>  <br>
  7. William Shakespeare, 
  8. Hamlet <br>
  9. <br>
  10.  
  11. </page>
  12. <page>
  13. <i>"The die is cast."</i>    <br>
  14. Julius Caesar<br>
  15. <br>
  16.  
  17. </page>
  18. <page>
  19. <i>"What's in a name? that 
  20. which we call a rose <p>
  21. By any other name would 
  22. smell as sweet."  
  23. </i><br>
  24. William Shakespeare,  
  25. Romeo and Juliet <br>
  26. <br>
  27.  
  28. </page>
  29. <page>
  30. <i>"O Diamond! Diamond! 
  31. thou little knowest the 
  32. mischief done!" </i> <br>
  33. Sir Isaac Newton   <br>
  34. <br>
  35.  
  36. </page>
  37. </section>
  38. <section type=Popup name=Answers title="Answers">
  39. <page pagename="Answer 21.1">
  40. <b>Answer 21.1</b><br>
  41. a) binary scope resolution (<b>::</b>).  <br>
  42. b) <b>const_cast</b>.<br>
  43. c) C-style, <b>dynamic_cast</b>, <b>static_cast</b>, or <b>reinterpret_cast
  44. </b><br>
  45. <foreign  name="exercises" url="^Exercises::c:s0p0">
  46. <br>
  47.  
  48. </page>
  49. <page pagename="Answer 21.2">
  50. <b>Answer 21.2</b><br>
  51. a)  False. One programmer may inadvertently choose the same <b>namespace</b> as 
  52. another.<br>
  53. b)  False. Namespaces can be nested.<br>
  54. c)  True.<br>
  55. <foreign  name="exercises" url="^Exercises::c:s0p1">
  56. <br>
  57.  
  58. </page>
  59. <page pagename="Answer 21.3">
  60. <b>Answer 21.3</b><br>
  61. a)  <tt>typeid or dynamic_cast</tt>  <br>
  62. b)  <tt>using</tt>  <br>
  63. c)  <tt>or</tt>  <br>
  64. d)  <tt>mutable</tt>  <br>
  65. <foreign  name="exercises" url="^Exercises::c:s0p2">
  66. <br>
  67.  
  68. </page>
  69. <page pagename="Answer 21.4">
  70. <b>Answer 21.4</b><br>
  71. a)  True.<br>
  72. b)  True.<br>
  73. c)  True.<br>
  74. d)  False. Keyword <tt><b>explicit</b></tt> can only be used with constructors.<br>
  75. <foreign  name="exercises" url="^Exercises::c:s0p3">
  76. <br>
  77.  
  78. </page>
  79. <page pagename="Answer 21.13">
  80. <b>Answer 21.13</b><br>
  81. a)  true<br>
  82. b)  true<br>
  83. c)  false<br>
  84. d)  false<br>
  85. e)  false<br>
  86. f)  false<br>
  87. g)  true<br>
  88. <foreign  name="exercises" url="^Exercises::c:s0p12">
  89. <br>
  90.  
  91. </page>
  92. <page pagename="Answer 21.7">
  93. <b>Answer 21.7</b><br>
  94. The solution to this exercise can be found on your Cyber Classroom CD. Copy 
  95. the file cpphtp2/answers/P21_07.zip to your hard drive and unzip the program 
  96. code.<br>
  97. <foreign  name="exercises" url="^Exercises::c:s0p6">
  98. <br>
  99.  
  100. </page>
  101. <page pagename="Answer 21.8">
  102. <b>Answer 21.8</b><br>
  103. The solution to this exercise can be found on your Cyber Classroom CD. Copy 
  104. the file cpphtp2/answers/P21_08.zip to your hard drive and unzip the program 
  105. code.<br>
  106. <foreign  name="exercises" url="^Exercises::c:s0p7">
  107. <br>
  108.  
  109. </page>
  110. <page pagename="Answer 21.15">
  111. <b>Answer 21.15</b><br>
  112. The solution to this exercise can be found on your Cyber Classroom CD. Copy 
  113. the file cpphtp2/answers/P21_15.zip to your hard drive and unzip the program 
  114. code.<br>
  115. <foreign  name="exercises" url="^Exercises::c:s0p16">
  116. <br>
  117.  
  118. </page>
  119. </section>
  120. <section type=Body name=Default title="21 ANSI/ISO C++ Standard Language Additions">
  121. <page>
  122. <font size=18 bold>21 ANSI/ISO C++ Standard Language 
  123. Additions</font><hr>
  124. <a href="#s1p0">21.1<spacer width=20 height=1>Introduction</a>  <br>
  125. <a href="#s2p0">21.2<spacer width=20 height=1><b>bool</b> Data Type</a>  <br>
  126. <a href="#s3p0">21.3<spacer width=20 height=1><b>static_cast</b> Operator</a>  <br>
  127. <a href="#s4p0">21.4<spacer width=20 height=1><b>const_cast</b> Operator</a>  <br>
  128. <a href="#s5p0">21.5<spacer width=20 height=1><b>reinterpret_cast</b> Operator</a>  <br>
  129. <a href="#s6p0">21.6<spacer width=20 height=1>Namespaces</a>  <br>
  130. <a href="#s7p0">21.7<spacer width=20 height=1>Run-Time Type Information (RTTI)</a>  <br>
  131. <a href="#s8p0">21.8<spacer width=20 height=1>Operator Keywords</a>  <br>
  132. <foreign  name="objectivesButton" url="^Objective::c:s0p0">
  133. <foreign  name="quotes" url="^Quotes::c:s0p0">
  134.  
  135. </page>
  136. <page>
  137. <a href="#s9p0">21.9<tt><b><spacer width=20 height=1>explicit</b></tt> Constructors</a>  <br>
  138. <a href="#s10p0">21.10<spacer width=20 height=1><b>mutable</b> Class Members</a>  <br>
  139. <a href="#s11p0">21.11<spacer width=20 height=1>Pointers to Class Members (<b>.*</b> and <b>->*</b>)</a>  <br>
  140. <a href="#s12p0">21.12<spacer width=20 height=1>Multiple Inheritance and <b>virtual</b> Base Classes</a>  <br>
  141. <a href="#s13p0">21.13<spacer width=20 height=1>Closing Remarks</a>  <br>
  142. <a href="#s14p0">21.14<spacer width=20 height=1>Summary</a>  <br>
  143. <a href="^Terminology::c:s0p0">Terminology</a>  <br>
  144. <a href="^Illustration::c:s0p0">Figures</a>  <br>
  145. <foreign  name="objectivesButton" url="^Objective::c:s0p0">
  146. <foreign  name="quotes" url="^Quotes::c:s0p0">
  147.  
  148. </page>
  149. </section>
  150. <section type=Body name=Default title="21.1 Introduction">
  151. <page>
  152. <font size=18 bold>21.1 Introduction</font><hr>
  153. We now consider some newer ANSI/ISO C++ Draft 
  154. Standard features including data type <b>bool</b>, cast 
  155. operators, <b>namespace</b>s, run-time type information 
  156. (RTTI) and operator keywords. We also discuss 
  157. pointers-to-class-member operators and <b>virtual</b> base 
  158. classes--which are not new ANSI C++ features. This 
  159. chapter was co-authored with Mr. Tem Nieto, the 
  160. authors' colleague at Deitel & Associates, Inc.<br>
  161.  
  162. </page>
  163. </section>
  164. <section type=Body name=Default title="21.2 bool Data Type">
  165. <page>
  166. <font size=18 bold>21.2 <b>bool</b> Data Type</font><hr>
  167. The ANSI/ISO C++ draft standard provides data type 
  168. <b>bool</b> whose values may be <b>false</b> or <b>true</b> as a 
  169. preferred alternative to the old style of using <b>0</b> to 
  170. indicate false and nonzero to indicate true. The program 
  171. of <a href="^Code::c:s0p0"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 21.1</a> demonstrates data type <b>bool</b>.<br>
  172. <spacer width=16 height=1>Line 9 <br>
  173. <font size=2><br></font><font size=11><pre>
  174. bool boolean = false;<p>
  175. </pre></font>
  176. declares variable <b>boolean</b> to be of type <b>bool</b> and 
  177. initializes <b>boolean</b> to <b>false</b>. Variable <b>x</b> is declared 
  178. and initialized to <b>0</b>. Line 12<br>
  179. <font size=2><br></font><font size=11><pre>
  180. cout << "boolean is " << boolean<p>
  181. </pre></font>
  182.  
  183. </page>
  184. <page>
  185. outputs <b>boolean</b>'s value. The value <b>0</b> is output rather 
  186. than the keyword <b>false</b>. Numeric values are the 
  187. default display for <b>bool</b>s. <br>
  188. <spacer width=16 height=1>The value of <b>x</b> (input on line 14) is used as an <b>if</b>/
  189. <b>else</b>'s condition in line 20. If <b>x</b> is <b>0</b>, the condition is 
  190. <b>false</b>. Otherwise the condition is <b>true</b>. Note that 
  191. negative values are nonzero and therefore <b>true</b>.<br>
  192. <spacer width=16 height=1>Line 25 assigns <b>true</b> to <b>boolean</b>. The value of 
  193. <b>boolean</b> (<b>1</b>) is output on line 26. A <b>bool</b> variable 
  194. outputs as <b>0</b> or <b>1</b> by default. The stream insertion 
  195. operator <b><<</b> has been overloaded to display <b>bool</b>s as 
  196. integers.<br>
  197. <spacer width=16 height=1>Lines 27 and 28<br>
  198.  
  199. </page>
  200. <page>
  201. <font size=2><br></font><font size=11><pre>
  202. cout << "\nboolean output with boolalpha<p>
  203.      manipulator is " <p>
  204.      << boolalpha << boolean << endl;<p>
  205. </pre></font>
  206. uses the stream manipulator <b>boolalpha</b> to set the 
  207. output stream to display <b>bool</b> values as the strings 
  208. "<b>true</b>" and "<b>false</b>." Manipulator <b>boolalpha</b> can 
  209. also be used on input.<br>
  210. <spacer width=16 height=1>Pointers, <b>int</b>s, <b>float</b>s, etc. can be implicitly 
  211. converted to  <b>bool</b>s. Zero <a href="^Practice::c:s0p1"><img src="bckgrnds/icons/gpp_ico.gif" align=sidebar></a>values convert to <b>false</b> 
  212. and nonzero values convert to <b>true</b>. For example the 
  213. expression<br>
  214. <font size=2><br></font><font size=11><pre>
  215. bool dc = false + x * 2 - b && true;<p>
  216. </pre></font>
  217.  
  218. </page>
  219. <page>
  220. would assign <b>true</b> to <b>dc</b> assuming <b>x</b> is <b>3</b>, and <b>b</b> is 
  221. <b>true</b>. Note that the right-hand portion of the 
  222. assignment expression evaluates to <b>5</b>, but this value is 
  223. implicitly <a href="^Practice::c:s0p0"><img src="bckgrnds/icons/gpp_ico.gif" align=sidebar></a>converted to  <b>true</b>. <br>
  224.  
  225. </page>
  226. <page>
  227. <b>Select the true statement(s). </b><br>
  228. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Manipulator boolalpha can be used with input.">
  229. Manipulator boolalpha cannot be used with input.   <br>
  230. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Variables of type bool are displayed as integer values of 1 (true) and 0 (false) by default.">
  231. The stream insertion operator has been overloaded to display bools as "true" or "false" by default. <br>
  232. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  233. Manipulator boolalpha is defined in <iomanip>.  <br>
  234. <component type=button name=b label="Check Your Answer" width=125 height=24>
  235.  
  236. </page>
  237. </section>
  238. <section type=Body name=Default title="21.3 static_cast Operator">
  239. <page>
  240. <font size=18 bold>21.3 <b>static_cast</b> Operator</font><hr>
  241. The ANSI/ISO C++ draft standard introduces four new 
  242. cast operators to use in preference to the "old-style" 
  243. casting that has been used in C and C++. The new casts 
  244. are less powerful and more specific than old-style 
  245. casting, which gives the program more precise control. 
  246. Casting is dangerous and can often be a source of errors 
  247. so the new-style casts are also easier to spot and to 
  248. search for using automated tools. Another advantage to 
  249. the new-style casts is that the four casts have 
  250. completely separate purposes, whereas with the old-
  251. style casting the philosophy was "one cast fits all." <br>
  252.  
  253. </page>
  254. <page>
  255. C++ provides the <b>static_cast</b> operator for 
  256. conversion between types. Type checking is performed 
  257. at compile time.  <a href="^Errors::c:s0p0"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>Operator <b>static_cast</b> performs 
  258. standard conversions (e.g., <b>void</b> <b>*</b> to <b>char</b> <b>*</b>, <b>int</b> to 
  259. <b>float</b>, etc.) and their inverses. The program of <a href="^Code::c:s0p1"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 
  260. 21.2</a> demonstrates operator <b>static_cast</b>.<br>
  261. <spacer width=16 height=1>The program declares classes <b>BaseClass</b> and 
  262. <b>DerivedClass</b>. Each class defines a member 
  263. function <b>f</b>. Lines 20 and 21<br>
  264. <font size=2><br></font><font size=11><pre>
  265. double d = 8.22;<p>
  266. int x = static_cast< int >( d );<p>
  267. </pre></font>
  268. declare and initialize both <b>d</b> and <b>x</b>. The  
  269. <b>static_cast</b> <a href="^Engineer::c:s0p0"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>operator converts <b>d</b> from <b>double</b> to <br>
  270.  
  271. </page>
  272. <page>
  273. <b>int</b>. The <b>static_cast</b>  <a href="^Practice::c:s0p2"><img src="bckgrnds/icons/gpp_ico.gif" align=sidebar></a>operator can be used for 
  274. most conversions between fundamental data types such 
  275. as <b>int</b>, <b>double</b>, <b>float</b>, etc.<br>
  276. <spacer width=16 height=1><b>BaseClass</b> object <b>base</b> is instantiated on line 25 and 
  277. passed by reference to function <b>test</b> on line 26. The 
  278. address passed into <b>test</b> is received in pointer 
  279. <b>basePtr</b>. <b>DerivedClass</b> pointer <b>derivedPtr</b> is 
  280. declared on line 33. Line 36<br>
  281. <font size=2><br></font><font size=11><pre>
  282. derivedPtr = static_cast< DerivedClass * ><p>
  283.     ( basePtr );<p>
  284. </pre></font>
  285. uses <b>static_cast</b> to <i>downcast</i> from <b>BaseClass</b> <b>*</b> 
  286. to <b>DerivedClass</b> <b>*</b>. Although (as we saw in Chapter 
  287. 9) <i>downcasting</i> from a base class pointer to a derived <br>
  288.  
  289. </page>
  290. <page>
  291. class pointer is a potentially dangerous operation, 
  292. <b>static_cast</b> permits the cast. Function <b>f</b> is invoked 
  293. off <b>derivedPtr</b> (line 37).<br>
  294.  
  295. </page>
  296. <page>
  297. <b>Select the true statement(s). </b><br>
  298. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  299. Operator static_cast performs standard conversions between types.  <br>
  300. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  301. Type-checking for operator static_cast is performed at compile-time. <br>
  302. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Operator static_cast can be used for downcasting.">
  303. Operator static_cast cannot be used for downcasting from a base class to a derived class type. <br>
  304. <component type=button name=b label="Check Your Answer" width=125 height=24>
  305.  
  306. </page>
  307. </section>
  308. <section type=Body name=Default title="21.4 const_cast Operator">
  309. <page>
  310. <font size=18 bold>21.4 <b>const_cast</b> Operator</font><hr>
  311. C++ provides the <b>const_cast</b> operator for casting 
  312. away <b>const</b> or <b>volatile</b>. The program of <a href="^Code::c:s0p2"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 21.3</a> 
  313. demonstrates the use of <b>const_cast</b>.<br>
  314. <spacer width=16 height=1>Lines 5-12 declare class <b>ConstCastTest</b> that 
  315. contains three member functions and <b>private</b> 
  316. variable <b>number</b>. Two of the member functions are 
  317. declared <b>const</b>. Function <b>setNumber</b> sets 
  318. <b>number</b>'s value. Function <b>getNumber</b> returns 
  319. <b>number</b>'s value. <br>
  320. <spacer width=16 height=1>The <b>const</b> member function <b>printNumber</b> 
  321. modifies <b>number</b>'s value in line 24<br>
  322.  
  323. </page>
  324. <page>
  325. <font size=2><br></font><font size=11><pre>
  326. const_cast< ConstCastTest * >( this )->number--;<p>
  327. </pre></font>
  328. In <b>const</b> member function <b>printNumber</b>, the data 
  329. type of the <b>this</b> pointer is <b>const</b> <b>ConstCastTest</b> 
  330. <b>*</b>. The preceding statement casts away the "<b>const</b>-
  331. ness" of the <b>this</b> pointer with operator 
  332. <b>const_cast</b>. The type of the this pointer for the 
  333. remainder of that statement is now <b>ConstCastTest</b> 
  334. <b>*</b>. This allows <b>number</b> to be modified. Operator 
  335. <b>const_cast</b> cannot be used to directly cast away a 
  336. constant variable's "<b>const</b>-ness".<br>
  337.  
  338. </page>
  339. <page>
  340. <b>Select the true statement(s). </b><br>
  341. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  342. Operator const_cast temporarily "casts away" the const-ness of an object.   <br>
  343. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  344. Operator const_cast cannot be used to "cast away" the const-ness of a const data member.   <br>
  345. <component type=button name=b label="Check Your Answer" width=125 height=24>
  346.  
  347. </page>
  348. </section>
  349. <section type=Body name=Default title="21.5 reinterpret_cast Operator">
  350. <page>
  351. <font size=18 bold>21.5 <b>reinterpret_cast</b> Operator</font><hr>
  352. C++ provides the <b>reinterpret_cast</b> operator for 
  353. nonstandard casts (e.g. <b>void</b> <b>*</b> to <b>int</b>, etc.). Operator 
  354. <b>reinterpret_cast</b> can also be used for standard 
  355. casts (i.e., <b>double</b> to <b>int</b>, etc.). The program of <a href="^Code::c:s0p3"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 
  356. 21.4</a> demonstrates the use of the 
  357. <b>reinterpret_cast</b> operator.<br>
  358. <spacer width=16 height=1>The  <a href="^Portable::c:s0p0"><img src="bckgrnds/icons/port_ico.gif" align=sidebar></a>program declares an integer and three pointers. 
  359. Pointer <b>voidPtr</b> is initialized to the address of 
  360. <b>unsigned</b> <b>x</b> and pointer <b>charPtr</b> is initialized to 
  361. the C-style string "<b>C++</b>". Line 12<br>
  362.  
  363. </page>
  364. <page>
  365. <font size=2><br></font><font size=11><pre>
  366. unsignedPtr = reinterpret_cast< unsigned * ><p>
  367.     ( voidPtr );<p>
  368. </pre></font>
  369. uses <a href="^Debug::c:s0p0"><img src="bckgrnds/icons/dbt_ico.gif" align=sidebar></a>operator  <b>reinterpret_cast</b> to cast 
  370. <b>voidPtr</b> (of type <b>void</b> <b>*</b>) to <b>unsigned</b> <b>*</b> pointer 
  371. <b>unsignedPtr</b>. <br>
  372. <spacer width=16 height=1>Lines 18 and 19<br>
  373. <font size=2><br></font><font size=11><pre>
  374. cout << "\nchar * to unsigned results in: "<p>
  375.      << ( x = reinterpret_cast< unsigned ><p>
  376.     ( charPtr ) );<p>
  377. </pre></font>
  378. output the result of casting <b>charPtr</b> to <b>unsigned</b>. 
  379. The result assigned to <b>x</b> represents the decimal address 
  380. location of the string "<b>C++</b>". <br>
  381. <spacer width=16 height=1>Lines 22 and 23<br>
  382.  
  383. </page>
  384. <page>
  385. <font size=2><br></font><font size=11><pre>
  386. cout << "\nunsigned to char * results in: "<p>
  387.      << reinterpret_cast< char * >( x ) << endl;<p>
  388. </pre></font>
  389. cast the value of <b>x</b> to <b>char</b> <b>*</b>. The result is an address 
  390. (<b>char</b> <b>*</b>), which results in the output of the C-style 
  391. string. <br>
  392.  
  393. </page>
  394. </section>
  395. <section type=Body name=Default title="21.6 Namespaces">
  396. <page>
  397. <font size=18 bold>21.6 Namespaces</font><hr>
  398. A program includes many identifiers defined in 
  399. different scopes. Sometimes a variable of one scope 
  400. will "overlap" with a variable of the same name in a 
  401. different scope, potentially creating a problem. Such 
  402. overlapping can occur at many levels. Identifier 
  403. overlapping occurs frequently in third-party libraries 
  404. that happen to use the same names for global identifiers 
  405. (such as functions). When this occurs, compiler errors 
  406. are usually generated. <br>
  407. <spacer width=16 height=1>In an attempt to solve the problem, compiler vendors 
  408. begin global identifiers names with underscores (<b>_</b>) and <br>
  409.  
  410. </page>
  411. <page>
  412. third-party vendors begin the name of global identifiers 
  413. with their own special letter prefixes. This method 
  414. works well if programmers do not begin  <a href="^Practice::c:s0p3"><img src="bckgrnds/icons/gpp_ico.gif" align=sidebar></a>identifiers 
  415. with underscores and if different third-party vendors do 
  416. not use the same prefixes.<br>
  417. <spacer width=16 height=1>ANSI/ISO draft standard C++ attempts to solve this 
  418. problem with <b>namespace</b>s. Each <b>namespace</b> 
  419. defines a scope where global identifiers and global 
  420. variables are placed. To use a <b>namespace</b> member, 
  421. the member's name must be qualified with the 
  422. <b>namespace</b> name and the binary scope resolution 
  423. operator (<b>::</b>) as follows:<br>
  424. <font size=2><br></font><font size=11><pre>
  425. <i>namespace_name</i><b>::</b><i>member</i><p>
  426. </pre></font>
  427.  
  428. </page>
  429. <page>
  430. or a <b>using</b> statement must occur before the name is 
  431. used; typically <b>using</b> statements are placed at the 
  432. beginning of the file in which members of the 
  433. <b>namespace</b> are used. For example, the statement <br>
  434. <font size=2><br></font><font size=11><pre>
  435. using namespace namespace_name;<p>
  436. </pre></font>
  437. at the beginning of a source code file specifies that 
  438. members of <b>namespace</b> <i>namespace_name</i> can be 
  439. used in the file without preceding each  <a href="^Practice::c:s0p4"><img src="bckgrnds/icons/gpp_ico.gif" align=sidebar></a>member with 
  440. the <i>namespace_name</i> and the scope resolution operator 
  441. (<b>::</b>).<br>
  442. <spacer width=16 height=1>Not all <b>namespace</b>s are guaranteed to be unique. Two 
  443. third-party vendors may inadvertently use the same <br>
  444.  
  445. </page>
  446. <page>
  447. <b>namespace</b>. <a href="^Code::c:s0p4"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 21.5</a> demonstrates the use of 
  448. <b>namespace</b>s.<br>
  449. <spacer width=16 height=1>Line 4<br>
  450. <font size=2><br></font><font size=11><pre>
  451. using namespace std;<p>
  452. </pre></font>
  453. informs the compiler that <b>namespace</b> <b>std</b> is being 
  454. used. The contents of header file <b><iostream></b> are all 
  455. defined as part of <b>namespace</b> <b>std</b>.  <br>
  456. <spacer width=16 height=1>The <tt><i></i><b>using namespace</b></tt> statement specifies that 
  457. members of a <b>namespace</b> will be used frequently 
  458. throughout a program. This allows the programmer 
  459. access to all the members of the <b>namespace</b> and to 
  460. write more concise statements such as<br>
  461. <font size=2><br></font><font size=11><pre>
  462. cout << "d = " << d;<p>
  463. </pre></font>
  464.  
  465. </page>
  466. <page>
  467. rather than<br>
  468. <font size=2><br></font><font size=11><pre>
  469. std::cout << "d = " << d;<p>
  470. </pre></font>
  471. Without line 4, every <b>cout</b> and <b>endl</b> in <a href="^Code::c:s0p4"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 21.5</a> 
  472. would have to be qualified with <b>std::</b>. Many 
  473. members of the C++ community nevertheless feel that 
  474. writing <b>std::cout</b> will become the norm. The 
  475. <b>using</b> <b>namespace</b> statement can be used for 
  476. predefined <b>namespace</b>s (e.g., <b>std</b>) or programmer-
  477. defined <b>namespace</b>s.<br>
  478. <spacer width=16 height=1>Lines 8 through 17<br>
  479. <font size=2><br></font><font size=11><pre>
  480. namespace Example {<p>
  481.    const double PI = 3.14159;<p>
  482.    const double E = 2.71828; <p><p>
  483. </pre></font>
  484.  
  485. </page>
  486. <page>
  487. <font size=2><br></font><font size=11><pre>
  488.    int myInt = 8;<p>
  489.    void printValues();<p>
  490.    namespace Inner {   // nested namespace<p>
  491.       enum Years { FISCAL1 = 1990, FISCAL2,<p>
  492.           FISCAL3 };<p>
  493.    }<p>
  494. }<p>
  495. </pre></font>
  496. use the keyword <b>namespace</b> to define <b>namespace</b> 
  497. <b>Example</b>. The body of a <b>namespace</b> is delimited by 
  498. braces (<b>{}</b>). Unlike class bodies, <b>namespace</b> bodies 
  499. do not end in semicolons. <b>Example</b>'s members consist 
  500. of two constants (<b>PI</b> and <b>E</b>), an <b>int</b> (<b>myInt</b>), a 
  501. function (<b>printValues</b>), and a nested <b>namespace</b> 
  502. (<b>Inner</b>). Note that member <b>myInt</b> has the same name <br>
  503.  
  504. </page>
  505. <page>
  506. as global variable <b>myInt</b>. Variables that have the same 
  507. name must have different scopes--otherwise syntax 
  508. errors occur. A <b>namespace</b> can contain constants, 
  509. data, classes, nested <b>namespace</b>s, functions, etc. 
  510. Definitions of <b>namespace</b>s must occupy the global 
  511. scope or be nested within other <b>namespace</b>s.<br>
  512. <spacer width=16 height=1>Lines 19 through 21<br>
  513. <font size=2><br></font><font size=11><pre>
  514. namespace {<p>
  515.    double d = 88.22; <p>
  516. }                     <p>
  517. </pre></font>
  518. create an unnamed <b>namespace</b> containing the 
  519. member <b>d</b>. Unnamed  <b>namespace</b> <a href="^Engineer::c:s0p1"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>members occupy 
  520. the global <b>namespace</b>, are directly accessible and do <br>
  521.  
  522. </page>
  523. <page>
  524. not have to be qualified with a <b>namespace</b> name. 
  525. Global variables are also part of the global 
  526. <b>namespace</b> and are accessible in all scopes following 
  527. the declaration in the file. <br>
  528. <spacer width=16 height=1>Line 26 outputs the value of <b>d</b>. Member <b>d</b> is directly 
  529. accessible as part of the unnamed <b>namespace</b>. Line 
  530. 29 outputs the value of global variable <b>myInt</b>. Lines 
  531. 32 through 35<br>
  532. <font size=2><br></font><font size=11><pre>
  533. cout << "\nPI = " << Example::PI << "\nE = "<p>
  534.      << Example::E << "\nmyInt = "<p>
  535.      << Example::myInt << "\nFISCAL3 = "<p>
  536.      << Example::Inner::FISCAL3 << endl;<p>
  537. </pre></font>
  538.  
  539. </page>
  540. <page>
  541. output the values of <b>PI</b>, <b>E</b>, <b>myInt</b>, and <b>FISCAL3</b>. <b>PI</b>, 
  542. <b>E</b>, and <b>myInt</b> are <b>Example</b> members and are 
  543. therefore qualified with <b>Example::</b>. Member <b>myInt</b> 
  544. must be qualified because a global variable has the 
  545. same name. Otherwise, the global variable's value is 
  546. output. <b>FISCAL3</b> is a member of nested <b>namespace</b> 
  547. <b>Inner</b> and is qualified with <b>Example::Inner::</b>. <br>
  548. <spacer width=16 height=1>Function <b>printValues</b> is a member of <b>Example</b> 
  549. and can directly access other members of the same 
  550. <b>namespace</b> without using a <b>namespace</b> qualifier. 
  551. The <b>cout</b> on line 44 outputs <b>myInt</b>, <b>PI</b>, <b>E</b>, <b>d</b>, and 
  552. global variable <b>myInt</b>, and <b>FISCAL3</b>. Notice that <b>PI</b> 
  553. and <b>E</b> are not qualified with <b>Example</b>, <b>d</b> is still <br>
  554.  
  555. </page>
  556. <page>
  557. accessible, the global version of <b>myInt</b> has been 
  558. qualified with the unary scope resolution operator (<b>::</b>), 
  559. and <b>FISCAL3</b> has been qualified with <b>Inner::</b>. 
  560. When accessing members of a nested <b>namespace</b>, the 
  561. members must be qualified with the <b>namespace</b> name 
  562. (unless you are inside the nested <b>namespace</b>).<br>
  563. <spacer width=16 height=1>The <b>using</b> keyword can also be used to allow an 
  564. individual <b>namespace</b> member to be used. For 
  565. example, the line<br>
  566. <font size=2><br></font><font size=11><pre>
  567. using Example::PI;<p>
  568. </pre></font>
  569. would allow <b>PI</b> to be used <a href="^Engineer::c:s0p2"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>without  <b>namespace</b> 
  570. qualification. This is done typically when only one  <br>
  571.  
  572. </page>
  573. <page>
  574. <b>namespace</b> <a href="^Errors::c:s0p2"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>member is frequently used. Namespaces 
  575. can be aliased. For example the statement<br>
  576. <font size=2><br></font><font size=11><pre>
  577. namespace CPPHTP2 = CPlusPlusHowToProgram2;<p>
  578. </pre></font>
  579. creates the alias <b>CPPHTP2</b> for 
  580. <b>CPlusPlusHowToProgram2</b>. <br>
  581.  
  582. </page>
  583. <page>
  584. <b>Select the true statement(s). </b><br>
  585. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  586. A namespace defines a scope.  <br>
  587. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. The possibility of one namespace colliding with another namespace always exists.">
  588. namespaces are guaranteed to be unique.   <br>
  589. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  590. Definitions of namespaces must occupy the global scope or be nested in other namespaces.  <br>
  591. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  592. One use of the using keyword is to allow an individual namespace member to be accessed.  <br>
  593. <component type=button name=b label="Check Your Answer" width=125 height=24>
  594.  
  595. </page>
  596. </section>
  597. <section type=Body name=Default title="21.7 Run-Time Type Information (RTTI)">
  598. <page>
  599. <font size=18 bold>21.7 Run-Time Type Information (RTTI)</font><hr>
  600. Run-time type information (RTTI) provides a means of 
  601. determining an object's type at run time. Two important  
  602. <a href="^Debug::c:s0p1"><img src="bckgrnds/icons/dbt_ico.gif" align=sidebar></a>RTTI operators are discussed in this section: <b>typeid</b> 
  603. and <b>dynamic_cast</b>. The program of <a href="^Code::c:s0p5"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 21.6</a> 
  604. demonstrates <b>typeid</b> and the program of <a href="^Code::c:s0p6"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 21.7</a> 
  605. demonstrates <b>dynamic_cast</b>.<br>
  606. <spacer width=16 height=1>Line 4 includes the <b><typeinfo.h></b> (<tt><i></i><b><typeinfo></b></tt> 
  607. in ANSI/ISO draft standard C++) header file which 
  608. defines <b>typeid</b>. The program defines a function 
  609. template <b>maximum</b> that takes three arguments of the 
  610. specified data type <b>T</b> and determines and returns the <br>
  611.  
  612. </page>
  613. <page>
  614. largest. The <b>typename</b> keyword is used in place of 
  615. <b>class</b> keyword. In this situation, <b>typename</b> behaves 
  616. identically to <b>class</b>. <br>
  617. <spacer width=16 height=1>Line 18<br>
  618. <font size=2><br></font><font size=11><pre>
  619. const char *dataType = typeid( T ).name();<p>
  620. </pre></font>
  621. uses function <b>name</b> to return an implementation 
  622. defined, C-style string; representing <b>T</b>'s data type. The 
  623. compile-time <a href="^Practice::c:s0p5"><img src="bckgrnds/icons/gpp_ico.gif" align=sidebar></a>operator  <b>typeid</b> returns a reference to a 
  624. <b>type_info</b> object. A <b>type_info</b> object is a system 
  625. maintained object that represents a type. Note that the 
  626. string returned by <b>name</b> is owned by the system and 
  627. should not be <b>delete</b>d by the programmer. <br>
  628.  
  629. </page>
  630. <page>
  631. Operator <b>dynamic_cast</b> is used in polymorphic 
  632. programming to ensure that proper conversions take 
  633. place at run time (i.e., the compiler cannot verify 
  634. whether or not it is a proper conversion). Operator 
  635. <b>dynamic_cast</b> is often used for downcasting from a 
  636. base-class pointer to a derived-class pointer in 
  637. polymorphic programming. The program of <a href="^Code::c:s0p6"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 21.7</a> 
  638. demonstrates <b>dynamic_cast</b>. <br>
  639. <spacer width=16 height=1>The program defines a base class <b>Shape</b> (line 7) that 
  640. contains <b>virtual</b> function <b>area</b>, a derived class 
  641. <b>Circle</b> (line 12) that <b>public</b>ly inherits <b>Shape</b> and 
  642. a derived class <b>Cylinder</b> (line 24) that <b>public</b>ly <br>
  643.  
  644. </page>
  645. <page>
  646. inherits <b>Circle</b>. Both <b>Circle</b> and <b>Cylinder</b> 
  647. override function <b>area</b>.<br>
  648. <spacer width=16 height=1>In function <b>main</b> at lines 41 through 43, an object of 
  649. class <b>Circle</b> called <b>circle</b> is instantiated, an object 
  650. of class <b>Cylinder</b> called <b>cylinder</b> is instantiated 
  651. and a pointer to a <b>Shape</b> called <b>ptr</b> is declared and 
  652. initialized to zero. Lines 45 through 47 call  <a href="^Engineer::c:s0p3"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>function 
  653. <b>outputShapeArea</b> (defined at line 51) three times. 
  654. Each call to <b>outputShapeArea</b> will display one of 
  655. three results--the area of a <b>Circle</b>, the area of a 
  656. <b>Cylinder</b> or an indication that the <b>Shape</b> is not a 
  657. <b>Circle</b> or a <b>Cylinder</b>. Function 
  658. <b>outputShapeArea</b> receives a pointer to a <b>Shape</b> as <br>
  659.  
  660. </page>
  661. <page>
  662. an argument--the first call receives the address of 
  663. <b>circle</b>, the second call receives the address of 
  664. <b>cylinder</b> and the third call receives a base-class 
  665. <b>Shape</b>  <a href="^Errors::c:s0p3"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>pointer called <b>ptr</b>.<br>
  666. <spacer width=16 height=1>Line 57<br>
  667. <font size=2><br></font><font size=11><pre>
  668. cylinderPtr = dynamic_cast< const Cylinder * ><p>
  669.     ( shapePtr );<p>
  670. </pre></font>
  671. dynamically downcasts <b>shapePtr</b> (a <b>const</b> <b>Shape</b> 
  672. <b>*</b>) to a <b>const</b> <b>Cylinder</b> <b>*</b> using the cast operator 
  673. <b>dynamic_cast</b> As a result, <b>cylinderPtr</b> is 
  674. assigned either the address of the <b>cylinder</b> object or 
  675. <b>0</b> to indicate that the <b>Shape</b> is not a <b>Cylinder</b>. If the <br>
  676.  
  677. </page>
  678. <page>
  679. result of the cast is not <b>0</b>, the area of the <b>Cylinder</b> is 
  680. output.<br>
  681. <spacer width=16 height=1>Line 64<br>
  682. <font size=2><br></font><font size=11><pre>
  683. circlePtr = dynamic_cast< const Circle * ><p>
  684.     ( shapePtr );<p>
  685. </pre></font>
  686. dynamically downcasts <b>shapePtr</b> to a <b>const</b> 
  687. <b>Circle</b> <b>*</b> using the cast operator <b>dynamic_cast</b>. 
  688. As a result, <b>circlePtr</b> is assigned either the address 
  689. of the <b>circle</b> object or <b>0</b> to indicate that the <b>Shape</b> 
  690. is not a <b>Circle</b>. If the result of the cast is not <b>0</b>, the 
  691. area of the <b>Circle</b> is output. <br>
  692.  
  693. </page>
  694. <page>
  695. <b>Select the true statement(s). </b><br>
  696. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  697. RTTI provides a means of determining an object's type at execution time.  <br>
  698. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. The dynamic_cast operation is performed at run-time.">
  699. dynamic_cast operations are evaluated at compile-time.   <br>
  700. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  701. Operator typeid returns a reference to type_info object.  <br>
  702. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Attempting to use RTTI on void * pointers is a syntax error.">
  703. RTTI is often used on void * pointers to determine the data type of the address where they point. <br>
  704. <component type=button name=b label="Check Your Answer" width=125 height=24>
  705.  
  706. </page>
  707. </section>
  708. <section type=Body name=Default title="21.8 Operator Keywords">
  709. <page>
  710. <font size=18 bold>21.8 Operator Keywords</font><hr>
  711. The ANSI/ISO C++ draft standard provides operator 
  712. keywords (<a href="^Illustration::c:s0p1"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Fig. 21.8</a>) that can be used in place of several 
  713. C++ operators. Operator keywords can be useful for 
  714. programmers keyboards that do not support certain 
  715. characters such as <b>!</b>, <b>&</b>, <b>^</b>, <b>~</b>, <b>|</b>, etc.<br>
  716. <spacer width=16 height=1>The program of <a href="^Code::c:s0p7">Fig.<img src="bckgrnds/icons/code_ico.gif" align=sidebar> 21.9</a> demonstrates the use of the 
  717. operator keywords. This program was compiled with 
  718. Microsoft Visual C++ 5.0 which requires the header file 
  719. <b><iso646.h></b> to use the operator keywords. Other 
  720. compilers may differ, so check documentation for your 
  721. compiler to determine the header file to include (the <br>
  722.  
  723. </page>
  724. <page>
  725. compiler may not require any header file to use these 
  726. keywords).<br>
  727. <spacer width=16 height=1>The program declares and initializes two integers <b>a</b> and 
  728. <b>b</b>. Logical and bitwise operations are performed with <b>a</b> 
  729. and <b>b</b> using the various operator keywords. The result 
  730. of each operation is output.<br>
  731.  
  732. </page>
  733. <page>
  734. <b>Drag the correct operator to the box associated with 
  735. the operator:</b><br>
  736. <component type="drag" width=16 height=18 label="&&" name="&&">   <component type="drag" width=8 height=18 label="&" name="&">   <component type="drag" width=8 height=18 label="~" name="~">   <component type="drag" width=16 height=18 label="^=" name="^=">   <component type="drag" width=8 height=18 label="^" name="^">   <component type="drag" width=8 height=18 label="|" name="|">   <component type="drag" width=16 height=18 label="|=" name="|=">  <br>
  737. and<component type="drop" width=24 height=18 name="&&">  <br>
  738. or_eq<component type="drop" width=24 height=18 name="|=">  <br>
  739. compl<component type="drop" width=24 height=18 name="~">  <br>
  740. xor_eq<component type="drop" width=24 height=18 name="^=">  <br>
  741. or<component type="drop" width=24 height=18 name="|">  <br>
  742. xor<component type="drop" width=24 height=18 name="^">  <br>
  743. bitand<component type="drop" width=24 height=18 name="&">  <br>
  744. <component type=button name=b label="Check Your Answer" width=125 height=24>
  745.  
  746. </page>
  747. </section>
  748. <section type=Body name=Default title="21.9 explicit Constructors">
  749. <page>
  750. <font size=18 bold>21.9 <b>explicit</b> Constructors</font><hr>
  751. In Chapter 8, "Operator Overloading," we discussed 
  752. that any constructor that is called with one argument 
  753. can be used by the compiler to perform an implicit 
  754. conversion in which the type received by the 
  755. constructor is converted to an object of the class in 
  756. which the constructor is defined. The conversion is 
  757. automatic and the programmer need not use a cast 
  758. operator. In some situations implicit conversions are 
  759. undesirable or error-prone. For example, our <b>Array</b> 
  760. class in Fig. 8.4 defines a constructor that takes a single 
  761. <b>int</b> argument. The intent of this constructor is to create <br>
  762.  
  763. </page>
  764. <page>
  765. an <b>Array</b> object containing the number of elements 
  766. specified by the <b>int</b> argument. However, this 
  767. constructor can be misused by the compiler to perform 
  768. an implicit conversion. The program of <a href="^Code::c:s0p8"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 21.10</a> uses 
  769. a simplified version of class <b>Array</b> from Chapter 8 to 
  770. demonstrate an improper implicit conversion.<br>
  771. <spacer width=16 height=1>Line 60 in main<br>
  772. <font size=2><br></font><font size=11><pre>
  773. Array integers1( 7 );<p>
  774. </pre></font>
  775. defines <b>Array</b> object <b>integers1</b> and calls the single 
  776. argument constructor with the <b>int</b> value <b>7</b> to specify 
  777. the number of elements in the <b>Array</b>. We modified the 
  778. <b>Array</b> constructor so it outputs a line of text indicating <br>
  779.  
  780. </page>
  781. <page>
  782. that the <b>Array</b> constructor was called and the number 
  783. of elements that were allocated in the <b>Array</b>. Line 62<br>
  784. <font size=2><br></font><font size=11><pre>
  785. outputArray( integers1 );   <p>
  786.     // output Array integers1<p>
  787. </pre></font>
  788. calls function <b>outputArray</b> (defined at line 69) to 
  789. output the contents of the <b>Array</b>. Function 
  790. <b>outputArray</b> receives as its argument a <b>const</b> 
  791. <b>Array</b> <b>&</b> to the <b>Array</b>, then outputs the <b>Array</b> using 
  792. the overloaded stream insertion operator <b><<</b>. Line 64<br>
  793. <font size=2><br></font><font size=11><pre>
  794. outputArray( 15 );  <p>
  795.     // convert 15 to an Array and output  <p>
  796. </pre></font>
  797. calls function <b>outputArray</b> with the <b>int</b> value <b>15</b> 
  798. as an argument. There is no function <b>outputArray</b> <br>
  799.  
  800. </page>
  801. <page>
  802. that takes an <b>int</b> argument, so the compiler checks 
  803. class <b>Array</b> to determine if there is a conversion 
  804. constructor that can convert an <b>int</b> into an <b>Array</b>. 
  805. Because class <b>Array</b> provides a conversion 
  806. constructor, the compiler uses that constructor to create 
  807. a temporary <b>Array</b> object containing <b>15</b> elements and 
  808. passes the temporary <b>Array</b> object to function 
  809. <b>outputArray</b> to output the <b>Array</b>. The output 
  810. shows that the <b>Array</b> conversion constructor was 
  811. called for a <b>15</b> element <b>Array</b> and the contents of the 
  812. <b>Array</b> were output.<br>
  813. <spacer width=16 height=1>C++ provides the keyword <tt><i>explicit</i></tt> to suppress 
  814. implicit conversions via conversion constructors. A <br>
  815.  
  816. </page>
  817. <page>
  818. constructor that is declared <b>explicit</b> cannot be used 
  819. in an implicit conversion. The program of <a href="^Code::c:s0p9"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 21.11</a> 
  820. demonstrates an <b>explicit</b> constructor.<br>
  821. <spacer width=16 height=1>The only modification to the program of <a href="^Code::c:s0p8"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 21.10</a> was 
  822. the addition of the keyword <b>explicit</b> to the 
  823. declaration of the single-argument constructor at line 
  824. 11. When the program is compiled, the compiler 
  825. produces an error message indicating that the integer 
  826. value passed to <b>outputArray</b> at line 64 cannot be 
  827. converted to a <b>const</b> <b>Array</b> <b>&</b>. The compiler error 
  828. message is shown in the output window. Line 66 
  829. illustrates <a href="^Errors::c:s0p4"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>how to create an <b>Array</b> of <a href="^Errors::c:s0p5"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>15 elements and <br>
  830.  
  831. </page>
  832. <page>
  833. pass it to <b>outputArray</b> using <a href="^Engineer::c:s0p4"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>the <b>explicit</b> 
  834. constructor.<br>
  835.  
  836. </page>
  837. <page>
  838. <b>Select the true statement(s). </b><br>
  839. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  840. Single argument constructors can be used by the compiler to perform implicit conversions.  <br>
  841. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Constructors declared  can only be used to initialize objects of their class type.">
  842. An explicit single argument constructor can be used by the compiler to perform implicit conversions.explicit   <br>
  843. <component type=button name=b label="Check Your Answer" width=125 height=24>
  844.  
  845. </page>
  846. </section>
  847. <section type=Body name=Default title="21.10 mutable Class Members">
  848. <page>
  849. <font size=18 bold>21.10 <b>mutable</b> Class Members</font><hr>
  850. In<a href="#s4p0"> Section 21.4</a>, we introduced the <b>const_cast</b> 
  851. operator which allowed "<b>const</b>-ness" to be cast away. 
  852. C++ provides the storage class specifier <b>mutable</b> as 
  853. an alternative to <b>const_cast</b>. A <b>mutable</b> data 
  854. member is always modifiable even in a <b>const</b> member 
  855. function or <b>const</b> object. This reduces the <a href="^Portable::c:s0p1"><img src="bckgrnds/icons/port_ico.gif" align=sidebar></a>need to cast 
  856. away "<b>const</b>-ness."<br>
  857. <spacer width=16 height=1>Both <b>mutable</b> and <b>const_cast</b> allow a data 
  858. member to be modified; each is used in different 
  859. contexts. For a <b>const</b> object with no <b>mutable</b> data 
  860. members, operator <b>const_cast</b> must be used every <br>
  861.  
  862. </page>
  863. <page>
  864. time a member is to be modified. This greatly reduces 
  865. the chance of a member being accidently modified 
  866. because the member is not permanently modifiable. 
  867. Operations involving <b>const_cast</b> are typically 
  868. hidden in a member function's implementation. The 
  869. user of a class may not be aware that a <a href="^Engineer::c:s0p5"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>member is being 
  870. modified.<br>
  871. <spacer width=16 height=1>The program of <a href="^Code::c:s0p10"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 21.12</a> demonstrates using a 
  872. <b>mutable</b> member.<br>
  873. <spacer width=16 height=1>The program defines class <b>TestMutable</b> (line 5) that 
  874. contains a constructor, two functions and <b>private</b> 
  875. <b>mutable</b> data member <b>value</b>. Line 8<br>
  876. <font size=2><br></font><font size=11><pre>
  877. void modifyValue() const { value++; }<p>
  878. </pre></font>
  879.  
  880. </page>
  881. <page>
  882. defines function <b>modifyValue</b> as a <b>const</b> function 
  883. that increments <b>mutable</b> data member <b>value</b>. 
  884. Normally, a <b>const</b> member function cannot modify 
  885. data members unless the object on which the function 
  886. operates--i.e., to one to which <b>this</b> points--is cast 
  887. (using <b>const_cast</b>) to a non-<b>const</b> type. Because 
  888. <b>value</b> is <b>mutable</b>, this <b>const</b> function is able to 
  889. modify the data. Function <b>getValue</b> (line 9) is a 
  890. <b>const</b> function that returns <b>value</b>. Note <b>getValue</b> 
  891. could change <b>value</b> because <b>value</b> is <b>mutable</b>. <br>
  892. <spacer width=16 height=1>Line 16 declares <b>const</b> <b>TestMutable</b> object <b>t</b> and 
  893. initializes it to <b>99</b>. Line 18 outputs the contents of 
  894. <b>value</b>. Line 20 calls the <b>const</b> member function <br>
  895.  
  896. </page>
  897. <page>
  898. <b>modifyValue</b> to add one to <b>value</b>. Note that both <b>t</b> 
  899. and <b>modifyValue</b> are <b>const</b>. Line 21 outputs the 
  900. contents of <b>value</b> (<b>100</b>) to prove that the <b>mutable</b> 
  901. data member was indeed modified.<br>
  902.  
  903. </page>
  904. <page>
  905. <b>Select the true statement(s). </b><br>
  906. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  907. A mutable data member is always modifiable regardless of the member function or object being const.  <br>
  908. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  909. mutable is a storage class specifier. <br>
  910. <component type=button name=b label="Check Your Answer" width=125 height=24>
  911.  
  912. </page>
  913. </section>
  914. <section type=Body name=Default title="21.11 Pointers to Class Members (.* and ->*)">
  915. <page>
  916. <font size=18 bold>21.11 Pointers to Class Members (<b>.*</b> and <b>->*</b>)</font><hr>
  917. C++ provides the<b>.*</b> and <b>->*</b> operators for accessing 
  918. class members. Pointers to class members are not the 
  919. same kind of pointers we have discussed to this point. 
  920. Attempting to use the <b>-></b> or <b>*</b> operator with a pointer to 
  921. member generates syntax errors. The program of <a href="^Code::c:s0p10"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 
  922. 21.12</a> demonstrates the pointer-to-class <a href="^Errors::c:s0p6"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>member 
  923. operators.<br>
  924. <spacer width=16 height=1>The program declares class <b>Test</b> which provides 
  925. <b>public</b> member function <b>function</b> and <b>public</b> 
  926. data member <b>value</b>. Function <b>function</b> outputs 
  927. "<b>function</b>". Lines 11 and 12 prototype functions <br>
  928.  
  929. </page>
  930. <page>
  931. <b>arrowStar</b> and <b>dotStar</b>. In lines 16 through 18, 
  932. object <b>t</b> is instantiated and data member <b>value</b> of <b>t</b> is 
  933. set to <b>8</b>. Lines 19 and 20 calls functions <b>arrowStar</b> 
  934. and <b>dotStar</b>; each call passes the address of <b>t</b>. <br>
  935. <spacer width=16 height=1>Line 26 <br>
  936. <font size=2><br></font><font size=11><pre>
  937. void ( Test::*memPtr )() = &Test::function;<p>
  938. </pre></font>
  939. in function <b>arrowStar</b> declares and initializes 
  940. <b>memPtr</b> as a pointer to a member of class <b>Test</b> that is 
  941. a function with a <b>void</b> result and no parameters. 
  942. Examining the left side of the assignment--first, <b>void</b> 
  943. is the member function's return type. The empty 
  944. parenthesis indicate that this member function takes no 
  945. arguments. The middle parenthesis specify a pointer <br>
  946.  
  947. </page>
  948. <page>
  949. <b>memPtr</b> which points to a member of class <b>Test</b>. The 
  950. parenthesis around <b>Test::*memPtr</b> are required. 
  951. Note that <b>memPtr</b> is a standard function pointer if 
  952. <b>Test::</b> is not specified. Next we examine <a href="^Errors::c:s0p7"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>the right 
  953. value of the <a href="^Errors::c:s0p8"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>assignment.<br>
  954. <spacer width=16 height=1>The right side of the assignment uses the address 
  955. operator (<b>&</b>) to get the offset into the class for member 
  956. function <b>function</b> (which must return <b>void</b> and 
  957. take no arguments). Pointer <b>memPtr</b> is initialized to 
  958. this offset. Note that both the left side and right side of 
  959. the assignment in line 26 do not refer to any specific 
  960. object. Only the class name is used with the binary 
  961. scope resolution operator (<b>::</b>). Without the <b>&Test::</b>, <br>
  962.  
  963. </page>
  964. <page>
  965. the right side of the assignment in line 26 is a standard 
  966. function pointer.<br>
  967. <spacer width=16 height=1>Line 27<br>
  968. <font size=2><br></font><font size=11><pre>
  969. ( tPtr->*memPtr )();<p>
  970. </pre></font>
  971. invokes the member function to which <b>memPtr</b> points 
  972. (<b>function</b>). The <b>->*</b> operator is used to invoke the 
  973. member function at the offset specified by <b>memPtr</b>.  
  974. Line 32<br>
  975. <font size=2><br></font><font size=11><pre>
  976. int Test::*vPtr = &Test::value;<p>
  977. </pre></font>
  978. declares and initializes <b>vPtr</b> as a pointer to an <b>int</b> 
  979. data member of class <b>Test</b>. The right side of the 
  980. assignment specifies the offset of where to find the data <br>
  981.  
  982. </page>
  983. <page>
  984. member <b>value</b>. Note that without the <b>Test::</b>, <b>vPtr</b> 
  985. becomes an <b>int</b> <b>*</b> pointer to the address of <b>int</b> 
  986. <b>value</b>.<br>
  987. <spacer width=16 height=1>The next line<br>
  988. <font size=2><br></font><font size=11><pre>
  989. cout << ( *tPtr ).*vPtr << endl; <p>
  990. </pre></font>
  991. uses the<b>.*</b> operator to access the member to which 
  992. <b>vPtr</b> points. <a href="^Errors::c:s0p9"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>Note that in client code we can only use 
  993. pointer-to-member operators for accessible members. 
  994. In this example, both <b>value</b> and <b>function</b> are 
  995. <b>public</b>. In a member <a href="^Errors::c:s0p10"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>function of the class, all 
  996. members of the class are accessible.<br>
  997.  
  998. </page>
  999. </section>
  1000. <section type=Body name=Default title="21.12 Multiple Inheritance and virtual Base Classes">
  1001. <page>
  1002. <font size=18 bold>21.12 Multiple Inheritance and <b>virtual</b> Base 
  1003. Classes</font><hr>
  1004. In Chapter 9, we discussed multiple inheritance; the 
  1005. process by which one class inherits from two or more 
  1006. classes. Multiple inheritance is used, for example, in the 
  1007. C++ standard library to form class <b>iostream</b> (<a href="^Illustration::c:s0p2"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Fig. 
  1008. 21.14</a>).<br>
  1009. <spacer width=16 height=1>Class <b>ios</b> is the base class for both <b>ostream</b> and 
  1010. <b>istream</b>, each of which is formed with single 
  1011. inheritance. Class <b>iostream</b> inherits from both 
  1012. <b>ostream</b> and <b>istream</b>. This enables objects of class 
  1013. <b>iostream</b> to provide the functionality of both <br>
  1014.  
  1015. </page>
  1016. <page>
  1017. <b>istream</b>s and <b>ostream</b>s. In multiple inheritance 
  1018. hierarchies, the situation described in <a href="^Illustration::c:s0p2"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Fig. 21.14</a> is 
  1019. referred to as diamond inheritance. <br>
  1020. <spacer width=16 height=1>Because classes <b>ostream</b> and <b>istream</b> each inherit 
  1021. from <b>ios</b>, a potential problem exists for <b>iostream</b>. 
  1022. Class <b>iostream</b> could contain duplicate subobjects 
  1023. (i.e., the data from <b>ios</b> inherited into both <b>ostream</b> 
  1024. and <b>istream</b>). A problem could arise when an 
  1025. <b>iostream</b> pointer is upcast to an <b>ios</b> pointer. Two 
  1026. <b>ios</b> subobjects could exist. Which would then be used? 
  1027. Such a situation would be ambiguous and would result 
  1028. in a syntax error. The program of <a href="^Code::c:s0p12"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 21.15</a> 
  1029. demonstrates this kind of ambiguity but through <br>
  1030.  
  1031. </page>
  1032. <page>
  1033. implicit conversion rather than upcasting, of course, 
  1034. <b>iostream</b> does not really suffer from the problem we 
  1035. mentioned. In this section, we will explain how using 
  1036. <b>virtual</b> base classes solves the problem<a href="^Perform::c:s0p0"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a> of duplicate 
  1037. subobjects.<br>
  1038. <spacer width=16 height=1>The program defines class <b>Base</b> which contains pure 
  1039. <b>virtual</b> function <b>print</b>. Classes <b>DerivedOne</b> 
  1040. and <b>DerivedTwo</b> <b>public</b>ly inherit from <b>Base</b> and 
  1041. override <b>print</b>. Class <b>DerivedOne</b> and class 
  1042. <b>DerivedTwo</b> each contain a <b>Base</b> "subobject". <br>
  1043. <spacer width=16 height=1>Class <b>Multiple</b> multiply inherits from 
  1044. <b>DerivedOne</b> and <b>DerivedTwo</b>. Function <b>print</b> is <br>
  1045.  
  1046. </page>
  1047. <page>
  1048. overridden to call <b>DerivedTwo</b>'s <b>print</b>. Note the 
  1049. qualification to specify which subobject version to call.<br>
  1050. <spacer width=16 height=1>In <b>main</b>, an object of each class in the hierarchy is 
  1051. created. An array of <b>Base</b> <b>*</b> pointers is also declared. 
  1052. Each array element is initialized to the address of an 
  1053. object. An error occurs when the address of <b>both</b> (of 
  1054. multiply inherited type <b>Multiple</b>) is implicitly 
  1055. converted to <b>Base</b> <b>*</b>. Object <b>both</b> contains duplicate 
  1056. subobjects inherited from <b>Base</b> and this of course, 
  1057. makes calls to function <b>print</b> ambiguous. A <b>for</b> loop 
  1058. is written to polymorphically call <b>print</b> for each of 
  1059. the objects pointed to by <b>array</b>.<br>
  1060.  
  1061. </page>
  1062. <page>
  1063. The problem of duplicate subobjects is resolved with 
  1064. <b>virtual</b> inheritance. When a base class is inherited 
  1065. as <b>virtual</b>, only one subobject will appear in the 
  1066. derived class--a process called <tt><i>virtual</i></tt> base class 
  1067. inheritance. The program of <a href="^Code::c:s0p13"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 21.16</a> revises the 
  1068. program of <a href="^Code::c:s0p12"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 21.15</a> to use a <b>virtual</b> base class.<br>
  1069. <spacer width=16 height=1>Class <b>Base</b> is defined and contains pure <b>virtual</b> 
  1070. function <b>print</b>. Class <b>DerivedOne</b> inherits from 
  1071. <b>Base</b> with the line<br>
  1072. <font size=2><br></font><font size=11><pre>
  1073. class DerivedOne : virtual public Base {<p>
  1074. </pre></font>
  1075. and class <b>DerivedTwo</b> inherits from <b>Base</b> with the 
  1076. line<br>
  1077. <font size=2><br></font><font size=11><pre>
  1078. class DerivedTwo : virtual public Base {<p>
  1079. </pre></font>
  1080.  
  1081. </page>
  1082. <page>
  1083. Both classes inherit from <b>Base</b>--each contains one 
  1084. subobject from <b>Base</b>. Class <b>Multiple</b> inherits from 
  1085. both <b>DerivedOne</b> and <b>DerivedTwo</b>. Only one 
  1086. subobject of <b>Base</b> is inherited into class <b>Multiple</b>. 
  1087. The compiler now allows conversion to occur 
  1088. (<b>Multiple</b> <b>*</b> to <b>Base</b> <b>*</b>). In <b>main</b>, an object is 
  1089. created for each class in the hierarchy. An array of 
  1090. <b>Base</b> pointers is also declared. Each <b>array</b> element is 
  1091. initialized to the address of an object. Note that the 
  1092. upcast from <b>both</b>'s address to <b>Base</b> <b>*</b> is now 
  1093. permitted. A <b>for</b> loop is written to walk along <b>array</b> 
  1094. and polymorphically call <b>print</b> for each object.<br>
  1095.  
  1096. </page>
  1097. <page>
  1098. The design of hierarchies involving <b>virtual</b> base 
  1099. classes is straightforward when the default constructors 
  1100. are used for base classes. The previous two examples 
  1101. use compiler-generated default constructors. If a 
  1102. <b>virtual</b> base class provides a constructor, the design 
  1103. becomes more complicated because the most derived 
  1104. class is responsible for initializing the <b>virtual</b> base 
  1105. class.<br>
  1106. <spacer width=16 height=1>In our two examples, <b>Base</b>, <b>DerivedOne</b>, 
  1107. <b>DerivedTwo</b>, and <b>Multiple</b> are each the most 
  1108. derived class. If creating a <b>Base</b> object, <b>Base</b> is the 
  1109. most derived class. If creating a <b>DerivedOne</b> (or 
  1110. <b>DerivedTwo</b>) object, <b>DerivedOne</b> (or <br>
  1111.  
  1112. </page>
  1113. <page>
  1114. <b>DerivedTwo</b>) is the most derived class. If creating a 
  1115. <b>Multiple</b> object, <b>Multiple</b> is the most derived 
  1116. class. No matter how far down the hierarchy a class is, 
  1117. it is therefore the most derived class and responsible for 
  1118. initializing the <b>virtual</b> base class. In<a href="^Exercises::c:s0p18"> <img src="bckgrnds/icons/exercise.gif" align=sidebar>Exercise 21.17</a> 
  1119. we ask the reader to exercise <a href="^Engineer::c:s0p6"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>the concept of most 
  1120. derived class.<br>
  1121.  
  1122. </page>
  1123. <page>
  1124. <b>Select the true statement(s). </b><br>
  1125. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Inheritance hierarchies are capable of working when diamond inheritance occurs. Sometimes portions of the hierarchy must be redone. ">
  1126. When diamond inheritance occurs, the whole inheritance hierarchy must be redesigned.   <br>
  1127. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  1128. virtual base class inheritance can solve the problem of duplicate subobjects that occur with diamond inheritance.  <br>
  1129. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  1130. The most derived class is responsible for initializing the virtual base class.  <br>
  1131. <component type=button name=b label="Check Your Answer" width=125 height=24>
  1132.  
  1133. </page>
  1134. </section>
  1135. <section type=Body name=Default title="21.13 Closing Remarks ">
  1136. <page>
  1137. <font size=18 bold>21.13 Closing Remarks </font><hr>
  1138. We sincerely hope you have enjoyed learning C++ and 
  1139. object-oriented programming in this course. The future 
  1140. seems clear. We wish you success in pursuing it! <br>
  1141. <spacer width=16 height=1>We would greatly appreciate your comments, 
  1142. criticisms, corrections, and suggestions for improving 
  1143. the text. We will acknowledge all contributions in the 
  1144. next edition of the book. Please address all 
  1145. correspondence to our email address:<br>
  1146. <font size=2><br></font><font size=11><pre>
  1147. deitel@deitel.com<p>
  1148. </pre></font>
  1149. Good luck!<br>
  1150.  
  1151. </page>
  1152. </section>
  1153. <section type=Body name=Default title="21.14 Summary">
  1154. <page>
  1155. <font size=18 bold>21.14 Summary</font><hr>
  1156. <indent width=8 delay>*   The ANSI/ISO C++ draft standard provides data type 
  1157. <tt><b>bool</b></tt> (with values of <tt><b>false</b></tt> or <tt><b>true</b></tt>) as a preferred 
  1158. alternative to the old style of using <b>0</b> to indicate false 
  1159. and nonzero to indicate true. </indent>
  1160. <indent width=8 delay>*   The stream manipulator <tt><b>boolalpha</b></tt> sets the output 
  1161. stream to display <b>bool</b> values as the strings "<b>true</b>" 
  1162. and "<b>false</b>." </indent>
  1163. <indent width=8 delay>*   The ANSI/ISO C++ draft standard introduces four 
  1164. new cast operators to use in preference to "old-style" 
  1165. casting used in C and C++. </indent>
  1166. <indent width=8 delay>*  C++ provides the <tt><b>static_cast</b></tt> operator for con</indent>
  1167.  
  1168. </page>
  1169. <page>
  1170. <indent width=8 delay>*   version between types. Type checking is performed at 
  1171. compile time. </indent>
  1172. <indent width=8 delay>*   The <tt><b>const_cast</b></tt> operator casts away the <b>const</b>-
  1173. ness of objects.</indent>
  1174. <indent width=8 delay>*   The <b>reinterpret_cast</b> operator is provided for 
  1175. nonstandard casts (e.g. <b>void</b> <b>*</b> to <b>int</b>, etc.) between 
  1176. unrelated types.</indent>
  1177. <indent width=8 delay>*   Each <b>namespace</b> defines a scope where global 
  1178. identifiers and global variables are placed. To use a 
  1179. <b>namespace</b> member, the member's name must be 
  1180. qualified with the <b>namespace</b> name and the binary 
  1181. scope resolution operator (<b>::</b>) or a <b>using</b> statement 
  1182. must occur before the name is used.</indent>
  1183.  
  1184. </page>
  1185. <page>
  1186. <indent width=8 delay>*   A <b>namespace</b> can contain constants, data, classes, 
  1187. nested <b>namespace</b>s, functions, etc. Definitions of 
  1188. <b>namespace</b>s must occupy the global scope or be 
  1189. nested within other <b>namespace</b>s.</indent>
  1190. <indent width=8 delay>*   Unnamed <b>namespace</b> members occupy the global 
  1191. <tt><b>namespace</b></tt>. </indent>
  1192. <indent width=8 delay>*   Run-time type information (RTTI) provides a means 
  1193. of determining an object's type at run time. </indent>
  1194. <indent width=8 delay>*   The compile-time operator <b>typeid</b> returns a reference to a <b>type_info</b> object. A <b>type_info</b> object is 
  1195. a system maintained object that represents a type. </indent>
  1196. <indent width=8 delay>*   The <tt><b><typeinfo.h></b></tt> (<tt><b><typeinfo></b></tt> in ANSI/ISO 
  1197. draft standard C++) header file which defines <b>typeid</b>. </indent>
  1198.  
  1199. </page>
  1200. <page>
  1201. <indent width=8 delay>*   Operator <b>dynamic_cast</b> is used in polymorphic 
  1202. programming to ensure that proper conversions take 
  1203. place at run time. The result of a <b>dynamic_cast</b> is <b>0</b> 
  1204. if the for invalid cast operations.</indent>
  1205. <indent width=8 delay>*   The ANSI/ISO C++ draft standard provides operator 
  1206. keywords (<a href="^Illustration::c:s0p1"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Fig. 21.8</a>) that can be used in place of several C++ operators. </indent>
  1207. <indent width=8 delay>*   C++ provides the keyword <tt><b>explicit</b></tt> to suppress 
  1208. implicit conversions via conversion constructors. A 
  1209. constructor that is declared <b>explicit</b> cannot be used 
  1210. in an implicit conversion. </indent>
  1211. <indent width=8 delay>*   A <b>mutable</b> data member is always modifiable even 
  1212. in a <b>const</b> member function or <b>const</b> object. </indent>
  1213.  
  1214. </page>
  1215. <page>
  1216. <indent width=8 delay>*   C++ provides the<b>.*</b> and <b>->*</b> operators for accessing 
  1217. class members via pointers to those members. </indent>
  1218. <indent width=8 delay>*   Multiple inheritance can lead to the problem of duplicate subobjects. This is resolved with <b>virtual</b> inheritance. When a base class is inherited as <b>virtual</b>, 
  1219. only one subobject will appear in the derived class--a 
  1220. process called virtual base class inheritance. </indent>
  1221.  
  1222. </page>
  1223. </section>
  1224. <section type=Popup name=Debug title="Testing">
  1225. <page>
  1226. It is easy to use 
  1227. <b>reinterpret_cas
  1228. t</b> to perform dangerous 
  1229. manipulations that 
  1230. could lead to serious 
  1231. execution-time errors.<br>
  1232. <br>
  1233.  
  1234. </page>
  1235. <page>
  1236. In order to use RTTI, 
  1237. some compilers require 
  1238. RTTI capabilities to be 
  1239. enabled. Check your <p>
  1240. compiler's 
  1241. documentation for 
  1242. RTTI use.<br>
  1243. <br>
  1244.  
  1245. </page>
  1246. </section>
  1247. <section type=Popup name=Terminology title="Terminology">
  1248. <page>
  1249. <font size=14>
  1250. Symbols<br>
  1251. <b>->*</b> (pointer to member 
  1252. via object operator) 
  1253. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1254. <br>
  1255. <b>.*</b> operator 
  1256. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1257. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1258. <br>
  1259. A<br>
  1260. <b>and</b> 
  1261. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1262. <br>
  1263. <b>and_eq</b> 
  1264. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1265. <br>
  1266. B<br>
  1267. <b>bitand</b> 
  1268. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1269. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1270. <br>
  1271. <b>bool</b> 
  1272. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1273. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1274. <br>
  1275. <b>boolalpha</b> 
  1276. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1277. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1278. <br>
  1279. C<br>
  1280. <b>compl</b> 
  1281. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1282. <br>
  1283. </font>
  1284.  
  1285. </page>
  1286. <page>
  1287. <font size=14>
  1288. <b>const_cast</b> 
  1289. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1290. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1291.  
  1292. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1293. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1294. <br>
  1295. D<br>
  1296. diamond inheritance 
  1297. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1298. <br>
  1299. downcast 
  1300. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1301. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1302. <br>
  1303. <b>dynamic_cast</b> 
  1304. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1305.  
  1306. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1307. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1308. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1309. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1310. <br>
  1311. E<br>
  1312. <b>explicit</b> 
  1313. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1314. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1315. <br>
  1316. F<br>
  1317. <b>false</b> 
  1318. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1319. <br>
  1320. G<br>
  1321. global <b>namespace</b> 
  1322. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1323. <br>
  1324. global variable 
  1325. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1326. <br>
  1327. </font>
  1328.  
  1329. </page>
  1330. <page>
  1331. <font size=14>
  1332. I<br>
  1333. implicit conversion 
  1334. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1335.  
  1336. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1337. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1338. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1339. <br>
  1340. M<br>
  1341. most derived class 
  1342. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1343. <br>
  1344. <b>mutable</b> 
  1345. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1346. <br>
  1347. N<br>
  1348. <b>namespace</b> 
  1349. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1350. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1351. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1352.  
  1353. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1354. <br>
  1355. nested <b>namespace</b> 
  1356. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1357.  
  1358. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1359. <br>
  1360. <b>not</b> 
  1361. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1362. <br>
  1363. <b>not_eq</b> 
  1364. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1365. <br>
  1366. O<br>
  1367. </font>
  1368.  
  1369. </page>
  1370. <page>
  1371. <font size=14>
  1372. operator keywords 
  1373. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1374.  
  1375. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1376. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1377. <br>
  1378. <b>or</b> 
  1379. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1380. <br>
  1381. <b>or_eq</b> 
  1382. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1383. <br>
  1384. P<br>
  1385. pointer-to-class-member 
  1386. operator 
  1387. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1388. <br>
  1389. R<br>
  1390. <b>reinterpret_cast</b> 
  1391.  
  1392. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1393. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1394. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1395. <br>
  1396. run-time type 
  1397. information (RTTI) 
  1398. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1399.  
  1400. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1401. <br>
  1402. S<br>
  1403. </font>
  1404.  
  1405. </page>
  1406. <page>
  1407. <font size=14>
  1408. <b>static_cast</b> 
  1409. operator 
  1410. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1411. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1412. <br>
  1413. subobject 
  1414. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1415. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1416. <br>
  1417. T<br>
  1418. <b>true</b> 
  1419. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1420. <br>
  1421. <b>typeid</b> 
  1422. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1423. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1424. <br>
  1425. <b><typeinfo></b> 
  1426. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1427. <br>
  1428. <b><typeinfo.h></b> 
  1429. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1430. <br>
  1431. U<br>
  1432. <b>using</b> statement 
  1433. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1434. <br>
  1435. V<br>
  1436. <b>virtual</b> base class 
  1437.  
  1438. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1439. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1440. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1441. <br>
  1442. X<br>
  1443. </font>
  1444.  
  1445. </page>
  1446. <page>
  1447. <font size=14>
  1448. <b>xor</b> 
  1449. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1450. <br>
  1451. <b>xor_eq</b> 
  1452. <a href="$currentLink"><img src=iicons/bullbib.gif></a>
  1453. <br>
  1454. <br>
  1455. </font>
  1456.  
  1457. </page>
  1458. </section>
  1459. <section type=Popup name=Portable title="Portability">
  1460. <page>
  1461. Using 
  1462. <b>reinterpret_cas
  1463. t</b> can cause programs 
  1464. to behave differently on 
  1465. different platforms.<br>
  1466. <br>
  1467.  
  1468. </page>
  1469. <page>
  1470. The effect of 
  1471. attempting to modify an 
  1472. object that was defined 
  1473. as constant, regardless 
  1474. of whether that 
  1475. modification was made 
  1476. possible by a 
  1477. <b>const_cast</b> or C-
  1478. style cast, varies among 
  1479. compilers.<br>
  1480.  
  1481. </page>
  1482. </section>
  1483. <section type=Popup name=Illustration title="Illustrations">
  1484. <page>
  1485. <a href="^Code::c:s0p0">Fig. 21.1</a>  Demonstrating the fundamental data type <b>bool</b>.<br>
  1486. <a href="^Code::c:s0p1">Fig. 21.2</a>  Demonstrating operator <b>static_cast</b>.<br>
  1487. <a href="^Code::c:s0p2">Fig. 21.3</a>  Demonstrating the <b>const_cast</b> operator.<br>
  1488. <a href="^Code::c:s0p3">Fig. 21.4</a>  Demonstrating operator <b>reinterpret_cast</b>.<br>
  1489. <a href="^Code::c:s0p4">Fig. 21.5</a>  Demonstrating the use of <b>namespace</b>s.<br>
  1490. <a href="^Code::c:s0p5">Fig. 21.6</a>  Demonstrating <b>typeid</b>.<br>
  1491. <a href="^Code::c:s0p6">Fig. 21.7</a>  Demonstrating <b>dynamic_cast</b>.<br>
  1492. <a href="^Illustration::c:s0p1">Fig. 21.8</a>  Operator keywords as alternatives to operator symbols.<br>
  1493. <a href="^Code::c:s0p7">Fig. 21.9</a>  Demonstrating the use of the operator keywords.<br>
  1494. <a href="^Code::c:s0p8">Fig. 21.10</a>  Single-argument constructors and implicit conversions.<br>
  1495. <a href="^Code::c:s0p9">Fig. 21.11</a>  Demonstrating an <b>explicit</b> constructor.<br>
  1496. <a href="^Code::c:s0p10">Fig. 21.12</a>  Demonstrating a <b>mutable</b> data member.<br>
  1497. <a href="^Code::c:s0p11">Fig. 21.13</a>  Demonstrating the<b>.*</b> and<b> ->*</b> operators.<br>
  1498. <a href="^Illustration::c:s0p2">Fig. 21.14</a>  Multiple inheritance to form class <b>iostream</b>.<br>
  1499. <a href="^Code::c:s0p12">Fig. 21.15</a>  Attempting to call a multiply inherited function polymorphically.<br>
  1500. <a href="^Code::c:s0p13">Fig. 21.16</a>  Using <b>virtual</b> base classes.<br>
  1501. <br>
  1502.  
  1503. </page>
  1504. <page>
  1505. <font size=18><a href="~audio/Ch21/21fig008.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 21.8 - Operator keywords as alternatives to operator symbols.      <img src="graphics/ch21/fig21008.gif" ></font><br>
  1506.  
  1507. </page>
  1508. <page>
  1509. <font size=18>Fig<a href="~audio/Ch21/21fig014.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>ure 21.14 - Multiple inheritance to form class <b>iostream</b>.<img src="graphics/ch21/fig21014.gif" ></font><br>
  1510.  
  1511. </page>
  1512. </section>
  1513. <section type=Popup name=Perform title="Performance">
  1514. <page>
  1515. Duplicate subobjects 
  1516. consume memory.<br>
  1517. <br>
  1518.  
  1519. </page>
  1520. </section>
  1521. <section type=Popup name=Exercises title="Exercises">
  1522. <page pagename="Exercise 21.1">
  1523. <b>Exercise 21.1</b><br>
  1524. Fill in the blanks for each of the following.<br>
  1525. a)  The <b>________</b> operator qualifies a member with its <b>namespace</b>.<br>
  1526. b)  The <b>________</b> operator allows an object's "<b>const</b>-ness" to be cast away.<br>
  1527. c)  The <b>________</b> operator allows conversions between types.<br>
  1528. <foreign  name="answers" url="^Answers::c:s0p0">
  1529. <br>
  1530.  
  1531. </page>
  1532. <page pagename="Exercise 21.2">
  1533. <b>Exercise 21.2</b><br>
  1534. State which of the following are true and which are false. If a statement is false, 
  1535. explain why.<br>
  1536. a)  Namespaces are guaranteed to be unique.<br>
  1537. b)  Namespaces cannot have <b>namespace</b>s as members.<br>
  1538. c)  Data type <b>bool</b> is a fundamental data type.<br>
  1539. <foreign  name="answers" url="^Answers::c:s0p1">
  1540. <br>
  1541.  
  1542. </page>
  1543. <page pagename="Exercise 21.3">
  1544. <b>Exercise 21.3</b><br>
  1545. Fill in the blanks for each of the following.<br>
  1546. a)  The <b>________</b> operator is used to determine an object's type at run-time.<br>
  1547. b)  The <b>________</b> keyword specifies that a <b>namespace</b> or namespace 
  1548. member is being used.<br>
  1549. c)  The operator <b>________</b> is the operator keyword for logical OR.<br>
  1550. d)  Storage specifier <b>________</b> allows a member of a <b>const</b> object to be 
  1551. modified.<br>
  1552. <foreign  name="answers" url="^Answers::c:s0p2">
  1553. <br>
  1554.  
  1555. </page>
  1556. <page pagename="Exercise 21.4">
  1557. <b>Exercise 21.4</b><br>
  1558. State which of the following are true and which are false. If a statement is false, 
  1559. explain why.<br>
  1560. a)  The validity of a <b>static_cast</b> operation is checked at compile-time.<br>
  1561. b)  The validity of a <b>dynamic_cast</b> operation is checked at run-time.<br>
  1562. c)  The name <b>typeid</b> is a keyword.<br>
  1563. d)  The <b>explicit</b> keyword may be applied to constructors, member functions, 
  1564. and data members.<br>
  1565. <foreign  name="answers" url="^Answers::c:s0p3">
  1566. <br>
  1567.  
  1568. </page>
  1569. <page pagename="Exercise 21.5">
  1570. <b>Exercise 21.5</b><br>
  1571. What does each expression evaluate to? (Note: some expressions may generate 
  1572. errors; if so, say what the cause of the error is.)<br>
  1573. a)  <b>cout << false;</b> <br>
  1574. b)  <b>cout << ( bool b = 8 );
  1575. </b><br>
  1576. c)  <b>cout << ( a = true );   // a is of type int
  1577. </b><br>
  1578. d)  <b>cout << ( *ptr + true && p );   // *ptr is 10 and p 
  1579. is 8.88
  1580. </b><br>
  1581. e)  <b>// *ptr is 0 and m is false<p>
  1582. <spacer width=20 height=1>bool k = ( *ptr * 2 || ( true + 24 ) );   
  1583. </b><br>
  1584. f)  <b>bool s = true + false;
  1585. </b><br>
  1586. g)  <b>cout << boolalpha << false << setw( 3 ) << true;
  1587. </b><br>
  1588.  
  1589. </page>
  1590. <page pagename="Exercise 21.6">
  1591. <b>Exercise 21.6</b><br>
  1592. Write a <b>namespace</b> <b>Currency</b> which defines constant members <b>ONE</b>, <b>TWO</b>, 
  1593. <b>FIVE</b>, <b>TEN</b>, <b>TWENTY</b>, <b>FIFTY</b>, and <b>HUNDRED</b>. Write two short programs that 
  1594. use <b>Currency</b>. One program should make all constants available and the other 
  1595. program should only make <b>FIVE</b> available.<br>
  1596. <br>
  1597.  
  1598. </page>
  1599. <page pagename="Exercise 21.7">
  1600. <b>Exercise 21.7</b><br>
  1601. Write a program that uses the <b>reinterpret_cast</b> operator to cast different 
  1602. pointer types to <b>int</b>. Do any conversions result in syntax errors?<br>
  1603. <foreign  name="answers" url="^Answers::c:s0p5">
  1604. <br>
  1605.  
  1606. </page>
  1607. <page pagename="Exercise 21.8">
  1608. <b>Exercise 21.8</b><br>
  1609. Write a program that uses the <b>static_cast</b> operator to cast some 
  1610. fundamental data types to <b>int</b>. Does the compiler allow the casts to <b>int</b>?<br>
  1611. <foreign  name="answers" url="^Answers::c:s0p6">
  1612. <br>
  1613.  
  1614. </page>
  1615. <page pagename="Exercise 21.9">
  1616. <b>Exercise 21.9</b><br>
  1617. Write a program that demonstrates upcasting from a derived class to a base 
  1618. class. Use the <b>static_cast</b> operator to perform the upcast.<br>
  1619.  
  1620. </page>
  1621. <page pagename="Exercise 21.10">
  1622. <b>Exercise 21.10</b><br>
  1623. Write a program that creates an <b>explicit</b> constructor that takes two 
  1624. arguments. Does the compiler permit this? Remove <b>explicit</b> and attempt an 
  1625. implicit conversion. Does the compiler permit this?<br>
  1626.  
  1627. </page>
  1628. <page pagename="Exercise 21.11">
  1629. <b>Exercise 21.11</b><br>
  1630. What is the benefit of an <b>explicit</b> constructor? <br>
  1631.  
  1632. </page>
  1633. <page pagename="Exercise 21.12">
  1634. <b>Exercise 21.12</b><br>
  1635. Write a program that creates a class containing two constructors. One 
  1636. constructor should take a single <b>int</b> argument. The second constructor should 
  1637. take one <b>char</b> <b>*</b> argument. Write a driver program that constructs several 
  1638. different objects; each object having a different type passed into the constructor. 
  1639. Do not use <b>explicit</b>. What happens? Now use <b>explicit</b> only for the 
  1640. constructor that takes one <b>int</b>. What happens?<br>
  1641.  
  1642. </page>
  1643. <page pagename="Exercise 21.13">
  1644. <b>Exercise 21.13</b><br>
  1645. Given the following <b>namespace</b>s, answer whether or not each statement is true 
  1646. or false. Explain any false answers.<br>
  1647.  
  1648. <font size=14><pre>
  1649.  1 #include <string><p>
  1650.  2 namespace Misc {<p>
  1651.  3    using namespace std;<p>
  1652.  4    enum Countries { POLAND, SWITZERLAND, GERMANY, <p>
  1653.  5                     AUSTRIA, CZECH_REPUBLIC };  <p>
  1654.  6    int kilometers;<p>
  1655.  7    string s; <p>
  1656.  8 <p>
  1657.  9    namespace Temp {<p>
  1658.  10       short y = 77;<p>
  1659. </pre></font>
  1660. <foreign  name="answers" url="^Answers::c:s0p4">
  1661.  
  1662. </page>
  1663. <page pagename="Exercise 21.13">
  1664. <font size=14><pre>
  1665.  11       Car car;   // assume definition exists<p>
  1666. </pre></font>
  1667. <font size=14><pre>
  1668.  12    }<p>
  1669.  13 }<p>
  1670.  14 <p>
  1671.  15 namespace ABC {<p>
  1672.  16    using namespace Misc::Temp;<p>
  1673.  17    void *function( void *, int );<p>
  1674.  18 }<p>
  1675. </pre></font>
  1676. <br>
  1677. a)  Variable <b>y</b> is accessible within <b>namespace</b> <b>ABC</b>.<br>
  1678. b)  Object <b>s</b> is accessible within <b>namespace</b> <b>Temp</b>.<br>
  1679. c)  Constant <b>POLAND</b> is not accessible within <b>namespace</b> <b>Temp</b>.<br>
  1680. <foreign  name="answers" url="^Answers::c:s0p4">
  1681.  
  1682. </page>
  1683. <page pagename="Exercise 21.13">
  1684. d)  Constant <b>GERMANY</b> is accessible within <b>namespace</b> <b>ABC</b>.<br>
  1685. e)  Function <b>function</b> is accessible to <b>namespace</b> <b>Temp</b>.<br>
  1686. f)  Namespace <b>ABC</b> is accessible to <b>Misc</b>.<br>
  1687. g)  Object <b>car</b> is accessible to <b>Misc</b>.<br>
  1688. <foreign  name="answers" url="^Answers::c:s0p4">
  1689. <br>
  1690.  
  1691. </page>
  1692. <page pagename="Exercise 21.14">
  1693. <b>Exercise 21.14</b><br>
  1694. Compare and contrast <b>mutable</b> and <b>const_cast</b>. Give at least one example 
  1695. of when one might be preferred over the other. Note: this exercise does not 
  1696. require any code to be written.<br>
  1697. <br>
  1698.  
  1699. </page>
  1700. <page pagename="Exercise 21.15">
  1701. <b>Exercise 21.15</b><br>
  1702. Write a program that uses <b>const_cast</b> to modify a <b>const</b> variable. (Hint: 
  1703. use a pointer in your solution to point to the <b>const</b> identifier.<br>
  1704. <foreign  name="answers" url="^Answers::c:s0p7">
  1705. <br>
  1706.  
  1707. </page>
  1708. <page pagename="Exercise 21.16">
  1709. <b>Exercise 21.16</b><br>
  1710. What problem does <b>virtual</b> base classes solve? <br>
  1711. <br>
  1712.  
  1713. </page>
  1714. <page pagename="Exercise 21.17">
  1715. <b>Exercise 21.17</b><br>
  1716. Write a program that use <b>virtual</b> base classes. The class at the top of the 
  1717. hierarchy should provide constructor that takes at least one argument (i.e., do not 
  1718. provide a default constructor). What challenges does this present for the 
  1719. inheritance hierarchy.<br>
  1720. <br>
  1721.  
  1722. </page>
  1723. <page pagename="Exercise 21.18">
  1724. <b>Exercise 21.18</b><br>
  1725. Find the error(s) in each of the following. When possible, explain how to correct 
  1726. each error.<br>
  1727. a)  <b>namespace Name {<p>
  1728.     int x, y;<p>
  1729.     mutable int z;<p>
  1730.   };
  1731. </b><br>
  1732. b)  <b>int integer = const_cast< int >( float );
  1733. </b><br>
  1734. c)  <b>namespace PCM( 111, "hello" );// construct namespace
  1735. </b><br>
  1736. d)  <b>explicit int x = 99;
  1737. </b><br>
  1738.  
  1739. </page>
  1740. </section>
  1741. <section type=Popup name=Objective title="Objectives">
  1742. <page>
  1743. <indent width=8 delay>*   To understand and use data type <b>bool</b>.</indent>
  1744. <indent width=8 delay>*   To be able to use cast operators: <b>static_cast</b>, <b>const_cast</b>, and 
  1745. <b>reinterpret_cast</b>.</indent>
  1746. <indent width=8 delay>*   To understand the concept of <b>namespaces</b>.</indent>
  1747. <indent width=8 delay>*   To understand and use run-time type information (RTTI) and operators 
  1748. <b>typeid</b> and <b>dynamic_cast</b>.</indent>
  1749. <foreign  name="audio" url="~audio/Ch21/21obj.au">
  1750.  
  1751. </page>
  1752. <page>
  1753. <indent width=8 delay>*   To understand operator keywords.</indent>
  1754. <indent width=8 delay>*   To understand <b>explicit</b> constructors.</indent>
  1755. <indent width=8 delay>*   To use <b>mutable</b> members in <b>const</b> objects.</indent>
  1756. <indent width=8 delay>*   To understand and use class member pointer operators <b>.*</b> and <b>->*</b>.</indent>
  1757. <indent width=8 delay>*   To understand the role of <b>virtual</b> base classes in multiple inheritance.</indent>
  1758. <br>
  1759.  
  1760. </page>
  1761. <page>
  1762.  
  1763. </page>
  1764. </section>
  1765. <section type=Popup name=Code title="Code Examples">
  1766. <page>
  1767. <font size=18>Figure 21.1 - Demonstrating the fundamental data type <b>bool
  1768. </b></font><br>
  1769. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1770. <param  name="file" value="code/ch21/fig21_01.txt">
  1771. </applet><br>
  1772. <br>
  1773. <foreign  name="copy2disk" url="!jcpy Source/fig21_01.jar">
  1774. <foreign  name="audio" url="~audio/Ch21/21fig001.au">
  1775. <foreign  name="execute" url="!jarexe Run/fig21_01.jar">
  1776. <br>
  1777.  
  1778. </page>
  1779. <page>
  1780. <font size=18>Figure 21.2 - Demonstrating operator <b>static_cast</b> </font><br>
  1781. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1782. <param  name="file" value="code/ch21/fig21_02.txt">
  1783. </applet><br>
  1784. <br>
  1785. <foreign  name="copy2disk" url="!jcpy Source/fig21_02.jar">
  1786. <foreign  name="audio" url="~audio/Ch21/21fig002.au">
  1787. <foreign  name="execute" url="!jarexe Run/fig21_02.jar">
  1788. <br>
  1789.  
  1790. </page>
  1791. <page>
  1792. <font size=18>Figure 21.3 - Demonstrating the <b>const_cast</b> operator</font><br>
  1793. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1794. <param  name="file" value="code/ch21/fig21_03.txt">
  1795. </applet><br>
  1796. <br>
  1797. <foreign  name="copy2disk" url="!jcpy Source/fig21_03.jar">
  1798. <foreign  name="audio" url="~audio/Ch21/21fig003.au">
  1799. <foreign  name="execute" url="!jarexe Run/fig21_03.jar">
  1800. <br>
  1801.  
  1802. </page>
  1803. <page>
  1804. <font size=18>Figure 21.4 - Demonstrating operator <b>reinterpret_cast</b> </font><br>
  1805. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1806. <param  name="file" value="code/ch21/fig21_04.txt">
  1807. </applet><br>
  1808. <br>
  1809. <foreign  name="copy2disk" url="!jcpy Source/fig21_04.jar">
  1810. <foreign  name="audio" url="~audio/Ch21/21fig004.au">
  1811. <foreign  name="execute" url="!jarexe Run/fig21_04.jar">
  1812. <br>
  1813.  
  1814. </page>
  1815. <page>
  1816. <font size=18>Figure 21.5 - Demonstrating the use of <b>namespace</b>s</font><br>
  1817. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1818. <param  name="file" value="code/ch21/fig21_05.txt">
  1819. </applet><br>
  1820. <br>
  1821. <foreign  name="copy2disk" url="!jcpy Source/fig21_05.jar">
  1822. <foreign  name="audio" url="~audio/Ch21/21fig005.au">
  1823. <foreign  name="execute" url="!jarexe Run/fig21_05.jar">
  1824. <br>
  1825.  
  1826. </page>
  1827. <page>
  1828. <font size=18>Figure 21.6 - Demonstrating <b>typeid</b> </font><br>
  1829. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1830. <param  name="file" value="code/ch21/fig21_06.txt">
  1831. </applet><br>
  1832. <br>
  1833. <foreign  name="copy2disk" url="!jcpy Source/fig21_06.jar">
  1834. <foreign  name="audio" url="~audio/Ch21/21fig006.au">
  1835. <foreign  name="execute" url="!jarexe Run/fig21_06.jar">
  1836. <br>
  1837.  
  1838. </page>
  1839. <page>
  1840. <font size=18>Figure 21.7 - Demonstrating <b>dynamic_cast</b> </font><br>
  1841. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1842. <param  name="file" value="code/ch21/fig21_07.txt">
  1843. </applet><br>
  1844. <br>
  1845. <foreign  name="copy2disk" url="!jcpy Source/fig21_07.jar">
  1846. <foreign  name="audio" url="~audio/Ch21/21fig007.au">
  1847. <foreign  name="execute" url="!jarexe Run/fig21_07.jar">
  1848. <br>
  1849.  
  1850. </page>
  1851. <page>
  1852. <font size=18>Figure 21.9 - Demonstrating the use of the operator keywords</font><br>
  1853. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1854. <param  name="file" value="code/ch21/fig21_09.txt">
  1855. </applet><br>
  1856. <br>
  1857. <foreign  name="copy2disk" url="!jcpy Source/fig21_09.jar">
  1858. <foreign  name="audio" url="~audio/Ch21/21fig009.au">
  1859. <foreign  name="execute" url="!jarexe Run/fig21_09.jar">
  1860. <br>
  1861.  
  1862. </page>
  1863. <page>
  1864. <font size=18>Figure 21.10 - Single-argument constructors and implicit conversions</font><br>
  1865. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1866. <param  name="file" value="code/ch21/fig21_10.txt">
  1867. </applet><br>
  1868. <br>
  1869. <foreign  name="copy2disk" url="!jcpy Source/fig21_10.jar">
  1870. <foreign  name="audio" url="~audio/Ch21/21fig010.au">
  1871. <foreign  name="execute" url="!jarexe Run/fig21_10.jar">
  1872. <br>
  1873.  
  1874. </page>
  1875. <page>
  1876. <font size=18>Figure 21.11 - Demonstrating an explicit constructor</font><br>
  1877. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1878. <param  name="file" value="code/ch21/fig21_11.txt">
  1879. </applet><br>
  1880. <br>
  1881. <foreign  name="copy2disk" url="!jcpy Source/fig21_11.jar">
  1882. <foreign  name="audio" url="~audio/Ch21/21fig011.au">
  1883. <br>
  1884.  
  1885. </page>
  1886. <page>
  1887. <font size=18>Figure 21.12 - Demonstrating a <b>mutable</b> data member</font><br>
  1888. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1889. <param  name="file" value="code/ch21/fig21_12.txt">
  1890. </applet><br>
  1891. <br>
  1892. <foreign  name="copy2disk" url="!jcpy Source/fig21_12.jar">
  1893. <foreign  name="audio" url="~audio/Ch21/21fig012.au">
  1894. <foreign  name="execute" url="!jarexe Run/fig21_12.jar">
  1895. <br>
  1896.  
  1897. </page>
  1898. <page>
  1899. <font size=18>Figure 21.13 - Demonstrating the <b>.*</b> and <b>->*</b> operators</font><br>
  1900. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1901. <param  name="file" value="code/ch21/fig21_13.txt">
  1902. </applet><br>
  1903. <br>
  1904. <foreign  name="copy2disk" url="!jcpy Source/fig21_13.jar">
  1905. <foreign  name="audio" url="~audio/Ch21/21fig013.au">
  1906. <foreign  name="execute" url="!jarexe Run/fig21_13.jar">
  1907. <br>
  1908.  
  1909. </page>
  1910. <page>
  1911. <font size=18>Figure 21.15 - Attempting to call a multiply inherited function polymorphically</font><br>
  1912. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1913. <param  name="file" value="code/ch21/fig21_15.txt">
  1914. </applet><br>
  1915. <br>
  1916. <foreign  name="copy2disk" url="!jcpy Source/fig21_15.jar">
  1917. <foreign  name="audio" url="~audio/Ch21/21fig015.au">
  1918. <br>
  1919.  
  1920. </page>
  1921. <page>
  1922. <font size=18>Figure 21.16 - Using <b>virtual</b> base classes</font><br>
  1923. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1924. <param  name="file" value="code/ch21/fig21_16.txt">
  1925. </applet><br>
  1926. <br>
  1927. <foreign  name="copy2disk" url="!jcpy Source/fig21_16.jar">
  1928. <foreign  name="audio" url="~audio/Ch21/21fig016.au">
  1929. <foreign  name="execute" url="!jarexe Run/fig21_16.jar">
  1930. <br>
  1931.  
  1932. </page>
  1933. </section>
  1934. <section type=Popup name=Practice title="Good Practices">
  1935. <page>
  1936. Using <b>true</b> and 
  1937. <b>false</b> instead of zero 
  1938. and nonzero values 
  1939. makes programs 
  1940. clearer.<br>
  1941. <br>
  1942.  
  1943. </page>
  1944. <page>
  1945. When creating state 
  1946. variables to indicate 
  1947. truth or falsity, use 
  1948. <b>bools</b> in preference to 
  1949. <b>ints</b>.<br>
  1950. <br>
  1951.  
  1952. </page>
  1953. <page>
  1954. Use the safer and more 
  1955. reliable 
  1956. <b>static_cast</b> 
  1957. operator in preference 
  1958. to the C-style cast 
  1959. operator.<br>
  1960. <br>
  1961.  
  1962. </page>
  1963. <page>
  1964. Avoid beginning 
  1965. identifiers with the 
  1966. underscore character, 
  1967. which can lead to linker 
  1968. errors.<br>
  1969. <br>
  1970.  
  1971. </page>
  1972. <page>
  1973. Precede a member with 
  1974. its <b>namespace</b> name 
  1975. and the scope 
  1976. resolution operator 
  1977. (<b>::</b>) if the possibility 
  1978. exists of a scoping 
  1979. conflict.<br>
  1980. <br>
  1981.  
  1982. </page>
  1983. <page>
  1984. Using <b>typeid</b> in 
  1985. <b>switch</b>-like tests is a 
  1986. misuse of RTTI. Use 
  1987. <b>virtual</b> functions 
  1988. instead.<br>
  1989. <br>
  1990.  
  1991. </page>
  1992. </section>
  1993. <section type=Popup name=Errors title="Common Errors">
  1994. <page>
  1995. Performing an illegal 
  1996. cast with operator 
  1997. <b>static_cast</b> is a 
  1998. syntax error. Illegal 
  1999. casts include casting 
  2000. from <b>const</b> types to 
  2001. non-<b>const</b> types, 
  2002. casting pointers and 
  2003. references between 
  2004. types that are not <br>
  2005.  
  2006. </page>
  2007. <page>
  2008. related by <b>public</b> 
  2009. inheritance, and casting 
  2010. to a type for which 
  2011. there is not an 
  2012. appropriate constructor 
  2013. or conversion operator 
  2014. to perform the cast.<br>
  2015. <br>
  2016.  
  2017. </page>
  2018. <page>
  2019. Placing <b>main</b> in a 
  2020. <b>namespace</b> is a 
  2021. syntax error. <br>
  2022. <br>
  2023.  
  2024. </page>
  2025. <page>
  2026. Attempting to use RTTI 
  2027. on a pointer of type 
  2028. <b>void</b> <b>* </b>is a syntax 
  2029. error.<br>
  2030. <br>
  2031.  
  2032. </page>
  2033. <page>
  2034. Attempting to invoke 
  2035. an <b>explicit</b> 
  2036. constructor for an 
  2037. implicit conversion is a 
  2038. syntax error.<br>
  2039.  
  2040. </page>
  2041. <page>
  2042. Using the <b>explicit</b> 
  2043. keyword on data 
  2044. members or member 
  2045. functions other than a 
  2046. single argument 
  2047. constructor is a syntax 
  2048. error.<br>
  2049.  
  2050. </page>
  2051. <page>
  2052. Attempting to use the <b>-
  2053. ></b> or <b>*</b> operator with a 
  2054. pointer to class member 
  2055. is a syntax error.<br>
  2056. <br>
  2057.  
  2058. </page>
  2059. <page>
  2060. Declaring a member 
  2061. function pointer 
  2062. without enclosing the 
  2063. pointer name in 
  2064. parentheses is a syntax 
  2065. error.<br>
  2066.  
  2067. </page>
  2068. <page>
  2069. Declaring a member 
  2070. function pointer 
  2071. without preceding the 
  2072. pointer name with a 
  2073. class name followed by 
  2074. the scope resolution 
  2075. operator (<tt><b>::</b></tt>) is a 
  2076. syntax error.<br>
  2077. <br>
  2078.  
  2079. </page>
  2080. <page>
  2081. Placing space(s) 
  2082. between the two 
  2083. characters of <b>.*</b> or <b>-
  2084. >*</b> is a syntax error.<br>
  2085. <br>
  2086.  
  2087. </page>
  2088. <page>
  2089. Reversing the order of 
  2090. the symbols in<b>.*</b> or <b>-
  2091. >*</b> is a syntax error.<br>
  2092. <br>
  2093.  
  2094. </page>
  2095. </section>
  2096. <section type=Popup name=Engineer title="Engineering">
  2097. <page>
  2098. With the additions to 
  2099. the ANSI/ISO C++ 
  2100. draft standard of the 
  2101. new cast operators 
  2102. (e.g., <b>static_cast</b>), 
  2103. old C-style casts are 
  2104. considered obsolete.<br>
  2105. <br>
  2106.  
  2107. </page>
  2108. <page>
  2109. Each separate 
  2110. compilation unit has its 
  2111. own unique unnamed 
  2112. <b>namespace</b>, i.e., the 
  2113. unnamed <b>namespace</b> 
  2114. replaces the <b>static</b> 
  2115. linkage specifier.<br>
  2116. <br>
  2117.  
  2118. </page>
  2119. <page>
  2120. Ideally in large 
  2121. programs, every entity 
  2122. should be declared in a 
  2123. class, function, block, 
  2124. or <b>namespace</b>. This 
  2125. helps clarify every 
  2126. entity's role.<br>
  2127. <br>
  2128.  
  2129. </page>
  2130. <page>
  2131. RTTI is intended for 
  2132. use with polymorphic 
  2133. inheritance hierarchies 
  2134. (with <b>virtual</b> 
  2135. functions).<br>
  2136. <br>
  2137.  
  2138. </page>
  2139. <page>
  2140. Use the <b>explicit</b> 
  2141. keyword on single-
  2142. argument constructors 
  2143. that should not be used 
  2144. by the compiler to 
  2145. perform implicit 
  2146. conversions.<br>
  2147.  
  2148. </page>
  2149. <page>
  2150. <b>mutable</b> members are 
  2151. useful in classes that 
  2152. have "secret" 
  2153. implementation details 
  2154. that do not contribute to 
  2155. the logical value of an 
  2156. object.<br>
  2157. <br>
  2158.  
  2159. </page>
  2160. <page>
  2161. Providing a default 
  2162. constructor for 
  2163. <b>virtual</b> base classes 
  2164. simplifies hierarchy 
  2165. design.<br>
  2166. <br>
  2167.  
  2168. </page>
  2169. </section>
  2170.  
  2171. <section type=Popup name=AppletPopup title="Applet Examples">
  2172. <page>
  2173. This chapter does not contain any Applet Examples.
  2174. </page>
  2175. </section>
  2176. </chapter>
  2177. </html>
  2178. </html>
  2179.